簡體   English   中英

調用完成處理程序后執行的代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM