我在func application(application:didFinishLaunchingWithOptions launchOptions:)
执行了一项网络任务功能。默认情况下,rootViewController
为UITabBarController
。我希望通过在应用启动时从服务器下载来同步我的品牌列表。我的代码如下:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.tabBarController = self.window?.rootViewController as! UITabBarController
.......
.......
.......
APICaller.getBrandsAndOutletList(withAuthToken: "87087fa228dee4fbbacada66683eb6fa94d4d8968dbc8121d275afe75a79e4b6d",
success: { (result) in
let rCode = result["rcode"] as! String
//If user revoked or access revoked for the user
guard rCode == "200" else {
let updateAppVC = UpdateAppViewController(nibName: "UpdateAppViewController", bundle: NSBundle.mainBundle())
if rCode == "401" {
let userStatus = result["status"] as! String
print(userStatus)
updateAppVC.message = userStatus
updateAppVC.buttonTitle = "Re-login"
self.window?.rootViewController = updateAppVC
//POINT-1
return
}else {
updateAppVC.message = "Some error"
updateAppVC.buttonTitle = "Retry"
self.window?.rootViewController = updateAppVC
//POINT-2
return
}
}
let brands = result["brands"] as! [[String:AnyObject]]
print(brands)
//POINT-3
}) { (errorMessage) in
print(errorMessage)
//POINT-4
}
return true //POINT-5
}
现在,发生了什么是网络请求,列表下载发生在后台。执行return true
并显示tabBar
。然后,在请求完成后,将调用success:
或failure:
块。
我想要实现的目标,在完成请求之前我不想return true
。所以不要在POINT-5上拨打return true
。相反,我想在POINT-1,2,3,4中调用return true
,即,当我的网络请求完成时。我可以这样做,如果是,那么如何?
答案 0 :(得分:1)
您不能使用完成块为上述方法创建返回值。
从上面的代码中可以看出,您希望在启动期间根据服务器上的数据切换屏幕。并且您不希望在呼叫发生时显示标签栏控制器。您可以做的是使用启动画面视图控制器(或屏幕简单活动指示器)并将其设置为根视图控制器,直到请求回合为止。