Ios 调用完成处理程序后执行的代码
为什么在调用完成处理程序后仍会继续 请参阅代码中的注释。请参阅代码路径以访问#1。此时,我希望代码调用completion handler complete(),并从函数返回,从而阻止执行#2。但是#2处的代码似乎仍在被触发。你知道为什么会发生这种情况吗Ios 调用完成处理程序后执行的代码,ios,swift,Ios,Swift,为什么在调用完成处理程序后仍会继续 请参阅代码中的注释。请参阅代码路径以访问#1。此时,我希望代码调用completion handler complete(),并从函数返回,从而阻止执行#2。但是#2处的代码似乎仍在被触发。你知道为什么会发生这种情况吗 func syncSessionLog(withCompletion complete: @escaping ((Bool, String?) -> Void)) { ... bunch of code man
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,“未找到”)
,结果相同。啊,我现在需要检查所有的完成处理程序哈哈。