Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 调用完成处理程序后执行的代码_Ios_Swift - Fatal编程技术网

Ios 调用完成处理程序后执行的代码

Ios 调用完成处理程序后执行的代码,ios,swift,Ios,Swift,为什么在调用完成处理程序后仍会继续 请参阅代码中的注释。请参阅代码路径以访问#1。此时,我希望代码调用completion handler complete(),并从函数返回,从而阻止执行#2。但是#2处的代码似乎仍在被触发。你知道为什么会发生这种情况吗 func syncSessionLog(withCompletion complete: @escaping ((Bool, String?) -> Void)) { ... bunch of code man

为什么在调用完成处理程序后仍会继续

请参阅代码中的注释。请参阅代码路径以访问#1。此时,我希望代码调用completion handler 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
func syncSessionLog(完成时:@escaping((Bool,String?)->Void)){
…一堆代码
managedObjectContext.performAndWait{
let trackFetchRequest:NSFetchRequest=Track.fetchRequest()
让trackPredicate=NSPredicate(格式:“id=\(session.track\u id)”)
trackFetchRequest.predicate=trackPredicate
trackFetchRequest.fetchLimit=1;
做{
让foundTrack=try self.managedObjectContext.fetch(trackFetchRequest)作为![Track]
如果foundTrack.count小于1{
self.debug.log(标记:“SessionManager”,内容:“找不到tID:\(session.track\u id)”)
//#1当找不到时,调用complete,但代码仍然设法到达底部的“do stuff”。
完整(假,“未找到”)
返回
}
associatedTrack=foundTrack[0]
}
抓住{
self.debug.log(标记:“SessionManager”,内容:“未能从核心数据获取跟踪对象:\(error.localizedDescription)”)
fatalCoreDataError(错误)
完成(false,“检索失败”)
}
}
//#2.与associatedTrack合作

return
将退出当前上下文,该上下文是与
performAndWait
关联的闭包。在该闭包返回后,继续执行
performAndWait
之后的下一条语句,即#2处的任何语句


您可以将代码从闭包内的第2点移动

这非常简单,
return
语句位于块内,因此它从块返回,而不是从外部方法返回。如果块有一些返回值,则更为明显


因此,代码中不需要此
return
。您需要设置
Bool
标志以指示块执行的结果,并在#2中相应地执行。

是否引发异常?catch函数调用
complete
且不返回(因此执行将流向#2).return将仅允许您退出等待块。而#2将继续在流上执行。如果您希望在完成后阻止执行,则需要在等待函数外使用布尔标志。根据您自己的逻辑更改其值,然后在#2检查标志的值,如果需要,请继续。不要忘记将标志声明为block.no,
associatedTrack
设置为零。:/I在继续之前,通过检查
associatedTrack
是否为零,我巧妙地解决了这个问题。但是,我想弄清楚这里到底发生了什么。@MaheshAgrawal在Swift中没有必要使用
\u block
。很抱歉,我在Swift 2中使用了,所以写在流程中……这是一个错误
complete()
或其他任何东西。你应该把块看作方法。如果你调用
self.complete()
,你不会期望代码停止吧?谢谢,我投了你的票,因为我不能接受你们两个。谢谢。
complete()
调用停止执行,从任何时候都不会到达
返回值
?否。
complete
调用完成处理程序,但在完成处理程序返回后,您将返回到完成处理程序调用后的语句,即
返回值
-但这只是退出闭包。ohhhh。我希望调用完成处理程序处理程序返回并执行闭包。不,调用完成处理程序就像调用任何其他函数一样。您可以调用变量
fred
,然后说
fred(false,“未找到”)
,结果相同。啊,我现在需要检查所有的完成处理程序哈哈。