【发布时间】:2016-10-05 17:42:49
【问题描述】:
在我的模型中,具有获取期望完成处理程序作为参数的数据的功能:
func fetchMostRecent(completion: (sortedSections: [TableItem]) -> ()) {
self.addressBook.loadContacts({
(contacts: [APContact]?, error: NSError?) in
// 1
if let unwrappedContacts = contacts {
for contact in unwrappedContacts {
// handle constacts
...
self.mostRecent.append(...)
}
}
// 2
completion(sortedSections: self.mostRecent)
})
}
它正在调用另一个异步加载联系人的函数,我将完成转发到该函数
fetchMostRecent 的完成调用如下所示:
model.fetchMostRecent({(sortedSections: [TableItem]) in
dispatch_async(dispatch_get_main_queue()) {
// update some UI
self.state = State.Loaded(sortedSections)
self.tableView.reloadData()
}
})
这有时会起作用,但通常执行顺序与我期望的不一样。问题是,有时在// 2 下的completion() 在// 1 下的if 范围完成之前执行。
这是为什么呢?如何确保在// 1 之后开始执行// 2?
【问题讨论】:
-
你说得对,我错过了另一个异步,我的错。那么使用局部变量,我可以首先避免这个麻烦吗?我知道我一开始尝试使用它,但我不知道该怎么做。
-
我明白了。需要异步调用,所以我会尝试调度组。谢谢。
标签: swift asynchronous closures