【问题标题】:How to aggregate response from multiple NSURLSessionDataTasks?如何聚合来自多个 NSURLSessionDataTasks 的响应?
【发布时间】:2015-10-09 21:14:53
【问题描述】:

我正在尝试从将同时运行的多个 NSURLSessionDataTask 中聚合数据。

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

如何使用在所有数据任务完成后调用的主回调或委托进行设置?

【问题讨论】:

    标签: ios objective-c nsurlsession nsurlsessiondatatask


    【解决方案1】:

    您可以使用调度组来监听所有调用何时结束:

    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 都有一个dispatch_group_leave 调用之前,通知块不会运行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 2019-02-27
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多