等到异步api调用完成 - Swift/IOS

bri*_*n S 5 closures swift

我正在开发一个ios应用程序,appDelegate我的内容是:

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
}
Run Code Online (Sandbox Code Playgroud)

api.signInWithToken是一个用Alamofire进行的异步调用,我想在func应用程序的最后一端返回true之前等待它的完成.

Ant*_*ton 11

注意:你不应该这样做,因为它会阻塞线程.有关更好的方法,请参阅Nate上面的评论.

有一种方法可以等待异步调用使用GCD完成.代码如下所示

var semaphore = dispatch_semaphore_create(0)

performSomeAsyncTask {
    ...
    dispatch_semaphore_signal(semaphore)
}

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
dispatch_release(semaphore)
Run Code Online (Sandbox Code Playgroud)

如果您对信号量一无所知,维基百科有一篇OK 文章.

  • 所以我删除了dispatch_release(semaphore),但是semaphore_wait似乎阻止了整个线程.看起来执行卡在我的异步闭包中. (2认同)