2016-11-17 137 views
2

在我下面的示例代码中,我会在失败时调用complete(false)。但是,由于我使用的是DispatchGroup对象来确保所有异步请求都已完成,因此我不能仅仅调用syncGroup.leave(),因为将调用notify,其中包含complete(true),因此该函数返回true,因此应返回false失败。如何使用DispatchGroup在for循环内进行异步调用

我在没有正确地完成我的功能时没有调用syncGroup.leave()正确吗?或者我应该打电话syncGroup.leave(),并以某种方式试图确定结果是什么,所以我可以返回false失败?

let syncGroup = DispatchGroup() 
syncGroup.enter() 
for track in unsynced { 
    register(time: time, withCompletion: { (success: Bool) ->() in 

     if success { 
      self.debug.log(tag: "SyncController", content: "Registered") 
      syncGroup.leave() 
     } 
     else { 
      complete(false) 
     } 
    }) 
} 

//all requests complete 
syncGroup.notify(queue: .main) { 
    self.debug.log(tag: "SyncController", content: "Finished registering") 
    complete(true) 
} 
+0

因为你分派很多任务,但只返回一个状态你的方法是有缺陷的。你需要考虑你想达到什么;也许你应该准备好接收多个回调函数(可能传递'track'以及true/false结果),或者调用回调函数一次,但传递一系列轨道/状态 – Paulw11

回答

2

您必须在您的for循环中输入该组。你可能想引入一个额外的错误标志。

实现示例:

var fail = false 
    let syncGroup = DispatchGroup() 

    for track in unsynced { 
     syncGroup.enter() 
     register(time: time, withCompletion: { (success: Bool) ->() in 

      if success { 
       self.debug.log(tag: "SyncController", content: "Registered") 
       syncGroup.leave() 
      } 
      else { 
       fail = true 
       syncGroup.leave() 
      } 
     }) 
    } 

    //all requests complete 
    syncGroup.notify(queue: .main) { 
     if fail { 
      complete(false) 

     } else { 
      self.debug.log(tag: "SyncController", content: "Finished registering") 
      complete(true) 
     } 
    } 
+0

如何退出该循环通过'unsynced'中剩余的对象? “休息”不会工作,因为它在关闭权? – toast

+0

你不能。循环触发你的异步操作。很可能(取决于任务使用的时间以及“未同步”的数量),所有注册任务在首次调用完成块之前触发。对于'unsynced'中的很多项目,您可以在'for循环'中添加'if fail {break}'作为第一个代码。 – shallowThought

+0

好的,谢谢。虽然这些请求是异步的,但它可能会节省一到两个请求的发送时间。 – toast