斯威夫特等待关闭完成

pet*_*itz 3 closures asynchronous function swift

我有异步任务的问题.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    self.loadRemote {
        log.debug("completed remote data")
    }
    self.loadLocal {
        log.debug("completed local data")
    }
    self.loadAdmin {
        log.debug("completed admin data")
    }
    dispatch_async(dispatch_get_main_queue()) {
        log.debug("called completed data")
        completed()
    }
}
Run Code Online (Sandbox Code Playgroud)

以下代码无法正常工作.它按以下顺序调用:

completed local data
called completed data
completed remote data
Run Code Online (Sandbox Code Playgroud)

这不是我所期望的.您可以想象我想要订单:"本地","远程",最后"称为已完成".

谢谢!

Rob*_*ier 8

这就是Dispatch Groups的用途.你在开始之前叫"输入",在你完成之后"离开".然后,您可以添加通知,该通知是在所有操作完成后排队的块.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    let group = dispatch_group_create()

    dispatch_group_enter(group)
    self.loadRemote {
        log.debug("completed remote data")
        dispatch_group_leave(group)
    }

    dispatch_group_enter(group)
    self.loadLocal {
        log.debug("completed local data")
        dispatch_group_leave(group)
    }

    dispatch_group_enter(group)
    self.loadAdmin {
        log.debug("completed admin data")
        dispatch_group_leave(group)
    }

    dispatch_group_notify(group, dispatch_get_main_queue()) {
        log.debug("called completed data")
        completed()
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于所有load...方法看起来都是异步的,这里的初始化似乎没有任何理由dispatch_async(但是它们可能在当前队列上比它们出现时更耗时).