Warum wird das fortgesetzt, nachdem der Beendigungshandler aufgerufen wurde?Code, der ausgeführt wird, nachdem der Vervollständigungshandler
Siehe die Kommentare im Code. Siehe den Code-Pfad, um zu # 1 zu gelangen. An dieser Stelle erwarte ich, dass der Code den Completion-Handler complete() aufruft und von der Funktion zurückkehrt, wodurch die Ausführung von # 2 verhindert wird. Code # 2 scheint jedoch immer noch ausgelöst zu werden. Irgendwelche Ideen warum dieses os auftritt?
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
Wird eine Ausnahme ausgelöst? Ihre Catch-Funktion ruft "complete" auf und kehrt nicht zurück (die Ausführung würde also zu # 2 gehen). – par
return lässt Sie nur aus dem Warteblock heraus. und # 2 wird den Fluss fortsetzen. Wenn Sie die Ausführung nach dem Abschluss blockieren möchten, benötigen Sie ein boolesches Flag außerhalb der Wartefunktion. Ändern Sie den Wert gemäß Ihrer eigenen Logik und überprüfen Sie dann bei # 2 den Wert des Flags und fahren Sie fort, wenn Sie es benötigen. Vergessen Sie nicht, das Flag als Block zu deklarieren. –
Nein, 'associatedTrack' wird auf Null gesetzt. :/Ich habe häcksisch gelöst, wenn ich überprüft habe, ob 'associatedTrack' gleich null ist, bevor ich weitermache. Allerdings würde ich gerne herausfinden, was hier wirklich vor sich geht. – toast