如何聚合来自多个NSURLSessionDataTasks的响应? [英] How to aggregate response from multiple NSURLSessionDataTasks?

查看:190
本文介绍了如何聚合来自多个NSURLSessionDataTasks的响应?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从多个同时运行的NSURLSessionDataTasks聚合数据.

I am trying to aggregate the data from multiple NSURLSessionDataTasks that will run concurrently.

__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];
}];

如何设置一个主回调或代理,一旦完成所有数据任务,该代理就会被调用?

How do I set this up with a master callback or delegate that gets called once all the data tasks are done?

推荐答案

您可以使用调度组来侦听所有呼叫的结束时间:

You can use a dispatch group to listen for when all the calls are finished:

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_enter

这篇关于如何聚合来自多个NSURLSessionDataTasks的响应?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆