为什么在调用完成处理程序后会继续这样做?
请参阅代码中的注释。请参阅代码路径以获取#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
答案 0 :(得分:2)
return
将退出当前上下文,这是与performAndWait
关联的闭包。在该闭包返回之后,继续执行performAndWait
之后的下一个语句,即{2}处的任何内容。
您可以从闭包
中的#2 点移动代码答案 1 :(得分:1)
非常简单 - return
语句位于块内,因此它从块返回,而不是从外部方法返回。如果块具有一些返回值,那将更加明显。
因此,您的代码中不需要此return
。您需要设置Bool
标志以指示块执行的结果,并在#2中按顺序执行。