2014-11-06 4 views
5

Ich arbeite an einem ios app, wo in meinem appDelegate ich habe:Warten Sie, bis ein asynchroner api Anruf beendet ist - Swift/IOS

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {  
    self.api.signInWithToken(emailstring, token: authtokenstring) { 
     (object: AnyObject?, error:String?) in    
      if(object != nil){ 
       self.user = object as? User 
       // go straight to the home view if auth succeeded 
       var rootViewController = self.window!.rootViewController as UINavigationController 
       let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
       var homeViewController = mainStoryboard.instantiateViewControllerWithIdentifier("HomeViewController") as HomeViewControllerenter 
       // code here 
       rootViewController.pushViewController(homeViewController, animated: true) 
      } 
     } 
    return true 
} 

Die api.signInWithToken ein asynchroner Aufruf mit Alamofire gemacht ist, und ich würde Ich warte gerne auf die Fertigstellung, bevor ich am Ende der Func-Anwendung auf true zurücktrete.

+2

Swift hat diese Art von Funktionalität nicht. Sie sollten Ihren Fenster- und Root-View-Controller im Hauptteil von "didFinishLaunching" einrichten, möglicherweise mit einer Ladegrafik, und dann zu einem neuen View-Controller im API-Abschlussverarbeiter navigieren. –

+0

didFinishLaunching ist veraltet, aber das klingt nach einer guten Idee –

Antwort

11

Hinweis: Sie sollten nicht tun es so, wie es den Thread blockiert. Siehe Nates Kommentar oben für einen besseren Weg.

Es gibt eine Möglichkeit zu warten, bis ein asynchroner Aufruf mit GCD abgeschlossen wird. Der Code würde wie folgt aussehen

var semaphore = dispatch_semaphore_create(0) 

performSomeAsyncTask { 
    ... 
    dispatch_semaphore_signal(semaphore) 
} 

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
dispatch_release(semaphore) 

Wikipedia hat ein OK article falls Sie nichts über Semaphore wissen.

+0

Ich versuchte das oben; dispatch_release (Semaphor) wurde von Apple entfernt. –

+2

Also habe ich dispatch_release (Semaphor) entfernt, aber der semaphore_wait scheint den ganzen Thread zu blockieren. Sieht so aus, als ob die Ausführung in meinem asynchronen Verschluss stecken geblieben ist. –

+1

Können Sie im Geiste des Lernens erklären, warum mein Kommentar eine schlechte Idee ist? –

1

Dies ist die Lösung in Swift 3. Auch dies blockiert den Thread, bis die asynchrone Aufgabe abgeschlossen ist, so dass es nur in bestimmten Fällen berücksichtigt werden sollte.

let semaphore = DispatchSemaphore(value: 0) 

performAsyncTask { 
    semaphore.signal() 
} 

// Thread will wait here until async task closure is complete 
semaphore.wait(timeout: DispatchTime.distantFuture) 
Verwandte Themen