【问题标题】:Multiple async methods, one completion handler多个异步方法,一个完成处理程序
【发布时间】:2017-06-30 21:40:04
【问题描述】:

我有两个异步方法:

- (void)login: (void (^)(BOOL))completion{
    // some network stuff with completion
}

- (void)download: (void (^)(BOOL))completion{
        // some network stuff with completion
    }

对于后台提取,我需要完成这两个方法,并且只返回一个完成。

我当然可以嵌套这些方法

 - (void)login: (void (^)(BOOL))completion{
      //....
       [self download:^(BOOL success) {
           //....
                 if (success){
                     completion(true);
                  }
         }];
    }

但是,一旦我添加了一个或多个需要同时完成的方法,代码就会变得混乱。

我记得曾经阅读过一种方法,您可以通过该方法将所有这些方法归为一个线程,但我似乎没有合适的词汇来在 SO 或其他地方找到它。

我希望你明白我在说什么,并为我指明正确的方向。

谢谢

【问题讨论】:

  • 你在考虑 dispatch_barrier_async 吗?
  • 查看调度组。您可能会发现这些链接很有用:12
  • 我愿意。您为我指出了正确的方向,但您的答案不包含该方向。对我来说,有效的是: dispatch_group_t serviceGroup = dispatch_group_create(); dispatch_group_enter(serviceGroup); [asyncMethod:^(BOOL Success) { if (Success){ dispatch_group_leave(serviceGroup); } }];

标签: ios completion


【解决方案1】:

如果任务确实存在依赖关系,并且您将来可能需要添加更多方法,那么您应该考虑使用NSOperationQueue

【讨论】:

    【解决方案2】:

    您可以做的是将completion block 向下传递给download 方法,这样当下载完成时,完成会一直链接到调用者,如下所示:

    - (void)login: (void (^)(BOOL))completion{
        // some network stuff with completion
        [self download:completion];
    }
    
    - (void)download: (void (^)(BOOL))completion{
        completion(YES);
        // some network stuff with completion
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-08
      • 2018-05-03
      • 2023-03-25
      • 2019-01-13
      • 2012-08-10
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多