В функции обратного вызова/блок (или обработчик завершения в терминах Apple) NSURLSession
(или NSURLSessionDataTask
), выполните проверку функционала на текущий объект Artist
и посмотреть, были ли все 3 требуемые элементы (и если да, сделайте звонок passArtist
).
Независимо от того, как выполняется окончательный заказ, он в конечном итоге назовет passArtist
после того, как он выполнит выбор из 3 элементов, если вы это сделаете.
Вот простой пример, чтобы продемонстрировать идею в Objective-C (по запросу OP):
- (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.
}
Это только одно решение. Есть много способов добиться того, что вы хотели, как только получите идею.
Возможный дубликат [Как выполнить две асинхронные функции последовательно] (http://stackoverflow.com/questions/35551771/how-to-execute-two-asynchronous-functions-sequential) – CouchDeveloper
Если вы хотите вызвать асинхронный функции _sequential_ - то есть вызов # 1, дождитесь окончания, затем получите результат, вызовите # 2 (возможно, с результатом # 1 как параметр), дождитесь окончания, возьмите результат # 2 и т. д. - вы должны иметь обработчик завершения или другие средства для уведомления вызывающего абонента о завершении функции асинхронизации. Таких вопросов уже много, а также хороших ответов на SO. – CouchDeveloper
Ваша проблема _may_ также содержит некоторую специальную «субарему»: наличие массива входов _N_ (например, URL-адресов) получает массив объектов _N_. Получение каждого объекта требует вызова асинхронной функции. Существуют также решения для этой проблемы, которые имеют ответил много раз на SO. – CouchDeveloper