在完成处理程序后执行的代码被称为
问题描述:
为什么在完成处理程序被调用后继续执行?在完成处理程序后执行的代码被称为
请参阅代码中的注释。查看代码路径以获得#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
答
它很简单 - return
语句块里面,所以它从块返回,而不是从外面方法。如果该块有一些返回值,它将更加明显。
因此,您的代码中不需要此return
。您将需要设置一个Bool
标志来指示块执行的结果,并在#2中采取同样的行动。
是否抛出异常?你的catch函数调用'complete'并且不返回(所以执行流向#2)。 – par
返回只会让您退出等待模块。 #2将继续流动。如果要在完成后阻止执行,则需要等待函数外的布尔标志。根据你自己的逻辑改变它的值,然后在#2检查标志的值,如果你需要的话继续。不要忘记宣布国旗为块。 –
不,''associatedTrack'设置为零。 :/我hackishly解决,如果通过检查'associatedTrack'是否为零,然后继续。不过,我想知道这里真正发生了什么。 – toast