调用完成处理程序后执行的代码

时间:2017-02-27 05:16:57

标签: ios swift

为什么在调用完成处理程序后会继续这样做?

请参阅代码中的注释。请参阅代码路径以获取#1。此时我期望代码调用完成处理程序complete(),并从函数返回,阻止执行#2。但是,#2的代码似乎仍然被触发。任何想法为什么这个os发生?

func syncSessionLog(withCompletion complete: @escaping ((Bool, String?) -> Void)) {

    ... bunch of code

        managedObjectContext.performAndWait {
            let trackFetchRequest: NSFetchRequest<NSFetchRequestResult> = Track.fetchRequest()
            let trackPredicate = NSPredicate(format: "id == \(session.track_id)")

            trackFetchRequest.predicate = trackPredicate
            trackFetchRequest.fetchLimit = 1;

            do {
                let foundTrack = try self.managedObjectContext.fetch(trackFetchRequest) as! [Track]
                if foundTrack.count < 1 {
                    self.debug.log(tag: "SessionManager", content: "not found tID: \(session.track_id)")

                    //#1 When not found, complete is called, yet the code still manages to reach "do stuff" down the bottom.

                    complete(false, "Not found")
                    return
                }

                associatedTrack = foundTrack[0]
            }
            catch {
                self.debug.log(tag: "SessionManager", content: "Failed to get Track object from Core Data: \(error.localizedDescription)")
                fatalCoreDataError(error)
                complete(false, "Failed to retrieve")
            }
        }

        //#2 do stuff with associatedTrack

2 个答案:

答案 0 :(得分:2)

return将退出当前上下文,这是与performAndWait关联的闭包。在该闭包返回之后,继续执行performAndWait之后的下一个语句,即{2}处的任何内容。

您可以从闭包

中的#2 点移动代码

答案 1 :(得分:1)

非常简单 - return语句位于块内,因此它从块返回,而不是从外部方法返回。如果块具有一些返回值,那将更加明显。

因此,您的代码中不需要此return。您需要设置Bool标志以指示块执行的结果,并在#2中按顺序执行。