等待,直到异步API调用完成 - 斯威夫特/ IOS
我工作的iOS应用,凡在我appDelegate
我:等待,直到异步API调用完成 - 斯威夫特/ 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
}
的api.signInWithToken
是Alamofire由异步调用,我会喜欢在func应用程序的最后端返回true之前等待它完成。
注意:您应该不是这样做,因为它阻止线程。请参阅Nate上面的评论以获得更好的方法。
有一种方法可以等待使用GCD完成异步调用。该代码看起来像下面
var semaphore = dispatch_semaphore_create(0)
performSomeAsyncTask {
...
dispatch_semaphore_signal(semaphore)
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
dispatch_release(semaphore)
维基百科的情况下,确定article你一无所知信号灯。
我尝试了上面的方法; dispatch_release(信号量)已被Apple删除。 – 2014-11-07 21:52:20
所以我删除了dispatch_release(信号量),但是semaphore_wait似乎阻塞了整个线程。看起来像执行停滞在我的异步封闭。 – 2014-11-07 22:12:02
本着学习的精神,你能解释为什么我的评论是一个坏主意吗? – 2014-11-07 23:33:27
这是Swift 3中的解决方案。这再次阻塞线程,直到异步任务完成,因此应仅在特定情况下考虑它。
let semaphore = DispatchSemaphore(value: 0)
performAsyncTask {
semaphore.signal()
}
// Thread will wait here until async task closure is complete
semaphore.wait(timeout: DispatchTime.distantFuture)
Swift没有这种功能。您需要在'didFinishLaunching'主体中设置窗口和根视图控制器,可能需要使用加载图形,然后导航到API登录完成处理程序中的新视图控制器。 – 2014-11-06 20:10:12
didFinishLaunching已弃用,但听起来像个好主意 – 2014-11-07 21:51:45