【问题标题】:Swift wait for closures to finishSwift 等待闭包完成
【发布时间】:2016-06-23 23:56:35
【问题描述】:

我对异步任务有疑问。

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

这不是我所期望的。你可以想象我想要的顺序是:“local”、“remote”,最后是“call completed”。

谢谢!

【问题讨论】:

    标签: swift function asynchronous closures


    【解决方案1】:

    这就是调度组的用途。你在开始之前调用“enter”,完成后调用“leave”。然后,您可以添加一个通知,这是一个在所有操作完成时加入队列的块。

    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 似乎没有任何理由(但它们在当前队列上可能比看起来更耗时)。

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多