![](/img/trans.png)
[英]Swift code being executed asynchronously even while in completion handler
[英]Code being executed after completion handler is called
在調用完成處理程序后,為什么會繼續這樣做?
請參閱代碼中的注釋。 請參閱代碼路徑以獲取#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
將退出當前上下文,這是與performAndWait
關聯的閉包。 在該閉包返回之后,繼續執行performAndWait
之后的下一個語句,這是#2處的任何內容。
您可以從閉包內的#2點移動代碼
它很簡單 - return
語句在一個塊內,所以它從塊返回,而不是從外部方法返回。 如果塊具有一些返回值,那將更加明顯。
因此,代碼中不需要此return
。 您需要設置一個Bool
標志來指示塊執行的結果,並在#2中按順序執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.