2013-05-27 3 views
0

Мое приложение загружает большое количество информации и изображений пользователей Flickr, и я использую AFHttpClient. Таким образом, в основном, каждый проходит через то, что эффективно является асинхронно, а затем выполняется блок завершения. Один класс имеет методы для каждого вызова api, а другой - через вызовы api, чтобы получить данные каждого пользователя, которые помещаются в основные данные. Тем не менее, моя проблема заключается в том, что я не могу определить способ для класса, вызывающего класс api, определить, когда все загрузки будут выполнены, и поместить его в основные данные. Кроме того, у меня будет одновременно загружаться несколько пользователей, а разные атрибуты завершают загрузку в разных заказах в зависимости от пользователя. Какие-либо предложения?Проверка завершения нескольких асинхронных сетевых операций

+0

смог найти какое-либо решение Были ли вы? Пожалуйста, опубликуйте некоторые. – Meet

ответ

0

Хранить подсчет количества активных запросов в процессе, используя переменную экземпляра. Это может быть простой NSInteger, который увеличивается и уменьшается, или может быть словарем, введенным по имени пользователя, и при необходимости содержать номер или более подробную запись отслеживания. Это действительно зависит от того, какой уровень детализации вам нужен. Класс, который вызывает вызовы API, должен делать все управление данными записи и просто предлагать методы «count».

1

AFNetworking сделал это довольно просто управлять несколько запросом и окончательным обратным вызовом, Juste использования:

- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations 
          progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock 
         completionBlock:(void (^)(NSArray *operations))completionBlock; 

или

- (void)enqueueBatchOfHTTPRequestOperationsWithRequests:(NSArray *)urlRequests 
             progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock 
            completionBlock:(void (^)(NSArray *operations))completionBlock; 

на AFHHTPClient инстанции.

Exemple:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]]; 
NSURLRequest *otherRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]]; 

AFHTTPRequestOperation *operationForImages = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
[operationForImages setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    //success of images request 
    self.imageDictionary = responseObject; 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    //manage error for this request 

}]; 
AFHTTPRequestOperation *operationForText = [[AFHTTPRequestOperation alloc] initWithRequest:otherRequest]; 
[operationForText setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    //success of text request 
    self.textDictionary = responseObject; 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    //manage error for this request 

}]; 


[[MyPersonalAFHTTPClient sharedClient] enqueueBatchOfHTTPRequestOperations:@[operationForImages,operationForText] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { 

    //track progression of requests 

} completionBlock:^(NSArray *operations) { 

    //all the request are completed 

}]; 
Смежные вопросы