2

同時に実行される複数の 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];
}];

すべてのデータ タスクが完了すると呼び出されるマスター コールバックまたはデリゲートを使用してこれを設定するにはどうすればよいですか?

4

1 に答える 1

7

ディスパッチ グループを使用して、すべての呼び出しがいつ終了するかをリッスンできます。

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

于 2015-10-09T21:27:24.177 に答える