Dans la fonction/bloc de rappel (ou , gestionnaire d'achèvement dans le terme Apple) de NSURLSession
(ou NSURLSessionDataTask
), exécutez une fonction de vérification. sur contre l'objet Artist
actuel et voir si tous les 3 éléments requis étaient là (et si oui, appelez passArtist
).
Peu importe la façon dont l'ordre d'arrivée est, il finira par appeler le passArtist
une fois qu'il aura récupéré 3 éléments si vous l'avez fait.
Voici un exemple simple pour démontrer l'idée Objective-C (OP comme demandé):
- (void)getArtistDataWithRequest:(NSURLRequest *)request
{
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error)
{
if (error)
{
// Something went wrong, fallback.
NSLog(@"An error occurred: %@", error.localizedDescription);
// You could use some error handler e.g.:
// [self connectionDidFailWithError:error];
return;
}
else if (response)
{
// Seems working, moving forward.
[self connectionDidReceiveSpotifyServerResponse:response
andData:data];
}
}];
[task resume];
}
- (void)connectionDidReceiveSpotifyServerResponse:(NSURLResponse *)aResponse
andData:(NSData *)aResponseData
{
// Do what you want here with the data you get, either it's album, track,
// or whatever.
// Assuming your "Artist" property is named "myArtist", and the "Artist"
// class has a method to process the data you get from Spotify API:
[_myArtist handleArtistData:aResponseData];
// Now check your Artist object's element with another method. e.g.:
if ([_myArtist isLoadingComplete])
{
// Done loading the object, pass it to view controller.
}
// Not yet done, do nothing for now.
}
Ceci est juste une solution. Il y a plusieurs façons de réaliser ce que vous voulez une fois que vous avez l'idée.
Possible duplication de [Comment exécuter séquentiellement deux fonctions asynchrones] (http://stackoverflow.com/questions/35551771/how-to-execute-two-asynchronous-functions-sequentially) – CouchDeveloper
Si vous voulez appeler l'asynchrone fonctions _sequentially_ - c'est-à-dire appelez # 1, attendez jusqu'à la fin puis récupérez le résultat, appelez # 2 (éventuellement avec le résultat # 1 comme paramètre), attendez la fin, prenez le résultat # 2, etc. - vous devez avoir gestionnaire d'achèvement ou d'autres moyens pour informer l'appelant que la fonction asynchrone est terminée. Il y a déjà beaucoup de telles questions et aussi de bonnes réponses sur SO. – CouchDeveloper
Votre problème peut aussi contenir un sous-problème spécial: un tableau d'entrées _N_ (par exemple des URLs) reçoit un tableau d'objets _N_ L'obtention de chaque objet nécessite l'appel d'une fonction asynchrone.Il existe également des solutions pour ce problème. été répondu à plusieurs reprises sur SO – CouchDeveloper