Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift闭包-关于值分配的代码执行顺序_Ios_Swift_Completionhandler - Fatal编程技术网

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
}