2015-10-09 5 views
1

Я пытаюсь объединить данные из нескольких NSURLSessionDataTasks, которые будут выполняться одновременно.Как агрегировать ответ из нескольких NSURLSessionDataTasks?

__block NSMutableDictionary *languageDetails = [NSMutableDictionary new]; 
[repos enumerateObjectsUsingBlock:^(NSDictionary *repoDict, NSUInteger idx, BOOL * _Nonnull stop) { 
    NSString *languageUrl = repoDict[@"languages_url"]; 
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:languageUrl] 
                  completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
                   // JSON Parse response 
                   // Update languageDetails 
                  }]; 
    [task resume]; 
}]; 

Как установить это с мастерами обратным вызовом или делегатом, который вызывается, когда все задачи данных выполняются?

ответ

5

Вы можете использовать диспетчерскую группу для прослушивания, когда все звонки закончены:

dispatch_group_t tasks = dispatch_group_create(); 

__block NSMutableDictionary *languageDetails = [NSMutableDictionary new]; 
[repos enumerateObjectsUsingBlock:^(NSDictionary *repoDict, NSUInteger idx, BOOL * _Nonnull stop) { 
    dispatch_group_enter(tasks); 

    NSString *languageUrl = repoDict[@"languages_url"]; 
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:languageUrl] 
                  completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
                   // JSON Parse response 
                   // Update languageDetails 

                   dispatch_group_leave(tasks); 
                  }]; 
    [task resume]; 
}]; 

dispatch_group_notify(tasks, dispatch_get_main_queue(), ^{ 
    // All the tasks are done, do whatever 
}); 

Уведомлять блок не будет работать до тех пор, пока не будет dispatch_group_leave вызова для каждого dispatch_group_enter