2015-10-09 2 views
1

J'essaie d'agréger les données de plusieurs NSURLSessionDataTasks qui s'exécuteront simultanément.Comment agréger la réponse de plusieurs 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]; 
}]; 

Comment puis-je régler cela avec un rappel maître ou son délégué qui est appelé une fois que toutes les tâches de données sont faites?

Répondre

5

Vous pouvez utiliser un groupe d'expédition pour écouter lorsque tous les appels sont terminés:

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 
}); 

Le bloc informe ne sera pas courir jusqu'à ce qu'il ya un appel dispatch_group_leave pour chaque dispatch_group_enter