Ios Swift闭包-关于值分配的代码执行顺序
我想详细了解在完成处理程序中处理数据时的正确执行顺序。我的事件类中有以下函数定义:Ios Swift闭包-关于值分配的代码执行顺序,ios,swift,completionhandler,Ios,Swift,Completionhandler,我想详细了解在完成处理程序中处理数据时的正确执行顺序。我的事件类中有以下函数定义: @nonobjc public class func fetchEvents(completion: @escaping ([Event]) -> () = { _ in }) -> [Event] { let fetch = self.fetchEventRequest() var entities: [Event] = [] context.perform {
@nonobjc public class func fetchEvents(completion: @escaping ([Event]) -> () = { _ in }) -> [Event] {
let fetch = self.fetchEventRequest()
var entities: [Event] = []
context.perform {
entities = try! fetch.execute()
completion(entities)
}
return entities
}
我从视图控制器中调用上述函数,如下所示:
events = MyEvents.fetchEvents() { entities in
if (entities.count == 0) {
self.events = Event.getEventsFromAPI()
}
print(events.count) - // returns 0 at this point
self.eventsTableView.reloadData()
}
调用self.eventsTableView.reloadData时,“我的事件”变量仍然为空。我假设,由于完成处理程序在成功执行函数内的代码后执行,因此events var将已经被分配了返回值,否?下面是有关函数的摘要:
...
context.perform {
entities = try! fetch.execute()
completion(entities)
}
return entities
斯威夫特是这样看的:
调用此context.perform函数
调用返回实体
在闭包内处理context.perform的输出
由于顺序的原因,它只返回值并认为其工作已完成。您的关闭很可能会完成,假设它保持在范围内,但否则不会有任何结果
最简单的方法是从以下位置更改功能:
@nonobjc public class func fetchEvents(completion: @escaping ([Event]) -> () = { _ in }) -> [Event]
致:
这里的区别是删除了[Event]返回
然后,在函数内部删除返回实体行
现在您有了一个异步函数,因此无论使用什么方法调用它,都必须对[Event]值使用闭包
self.events=Event.getEventsFromAPI类似于:
Event.getEventsFromAPI() = { [weak self] events in
self?.events = events
}
是的,这是我最初想要的解决办法,但我也在猜测这是否是一个正确的方法,所以我很高兴看到这一点得到验证。谢谢你的解释
Event.getEventsFromAPI() = { [weak self] events in
self?.events = events
}