Why is this continuing after the completion handler is called?

See the comments in the code. See the code path to get to #1. At this point I'm expecting the code to call the completion handler complete(), and return from the function, preventing execution of #2. However, code at #2 still appears to be getting triggered. Any ideas why this os occurring?

```
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

```