为什么在调用完成处理程序后继续进行?
查看代码中的注释。查看代码路径以到达#1。在这一点上,我期望代码调用完成处理程序 complete(),并从函数返回,从而阻止执行 #2。但是,#2 处的代码似乎仍会被触发。知道为什么会出现这个操作系统吗?
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
最佳答案
return
将退出当前上下文,这是与 performAndWait
关联的闭包。在该闭包返回后,继续执行 performAndWait
之后的下一条语句,即 #2 处的任何内容。
您可以将代码从第 2 点移到闭包中
关于ios - 调用完成处理程序后正在执行的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42478275/