我在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
,即我的網絡請求將完成。我能做到嗎,如果是的話那怎麼辦?
你試圖達到什麼目的?什麼會返回'假'對你意味着什麼?如果在後臺進程完成之前不返回'true',它將阻止主線程,並且應用程序將顯示無響應。你能描述一下你在後臺任務運行時想要發生什麼嗎? – Michael
@Michael我不介意UI在後臺任務運行時看起來沒有響應。我只想在我的閉包裏面返回true。我怎樣才能在封閉體內調用這個'return true',即在封閉體內部指定的點上? –
你不能。如果在閉包內部返回,則返回閉包,而不是主函數。如果封閉是一個單獨的功能,你會更明顯地看到這一點。您需要在後臺任務運行時顯示某些內容,否則只會顯示一個黑屏,用戶會疑惑爲什麼您的應用程序未啓動。如果完成任務需要一分鐘,該怎麼辦?在任務運行時立即返回'true'有什麼問題? – Michael