Swift等待闭包执行完毕

3

我有一个异步任务的问题。

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()
    }
}

以下代码并不按照我的期望工作。它的调用顺序如下:
completed local data
called completed data
completed remote data

这并不是我预期的结果。你可能会想象我希望顺序为:"本地","远程",最后是"调用完成"。

谢谢!

1个回答

8

这就是调度组的作用。在开始某项任务之前,您需要调用“enter”方法,在完成后则需要调用“leave”方法。然后,您可以添加一个通知(notification),它是一个块(block),当所有操作完成时将其加入队列。

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()
    }
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接