斯威夫特等待关闭完成

时间:2016-03-09 14:33:57

标签: swift function asynchronous closures

我遇到异步任务问题。

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 个答案:

答案 0 :(得分:8)

这就是Dispatch Groups的用途。你打电话给#34;输入"在开始之前,"离开"当你完成了。然后,您可以添加通知,这是一个在所有操作完成后排队的块。

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的初始值{但它们可能更耗时当前队列比它们出现的那样)。