У меня есть функция выполнения сетевой задачи в 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
перед заполнением запроса. Поэтому не хочу называть return true
на POINT-5. Вместо этого я хочу называть это return true
в POINT-1,2,3,4, то есть когда мой сетевой запрос будет завершен. Могу ли я это сделать, если да, то как?
Чего вы пытаетесь достичь? Что для вас означает «ложь»? Если вы не вернете 'true', пока фоновый процесс не будет завершен, он заблокирует основной поток, и приложение окажется невосприимчивым. Можете ли вы описать, что вы хотите, во время выполнения фоновой задачи? – Michael
@ Майкл Я не против пользовательского интерфейса, чтобы выглядеть невосприимчивым во время выполнения фоновой задачи. Я просто хочу «вернуть истину» в мое закрытие. Как я могу называть это 'return true' внутри закрытия, т. Е. В указанных точках, которые находятся внутри тела закрытия? –
Вы не можете. Если вы вернетесь в закрытие, это закрытие, которое возвращается, а не основная функция. Вы видели бы это более очевидно, если бы закрытие было отдельной функцией. Вам нужно отобразить что-то во время фоновой задачи, иначе у вас будет только черный экран, и пользователь будет задаваться вопросом, почему ваше приложение не запускалось. Что делать, если для завершения задачи требуется минута? Что не так с возвратом 'true' сразу во время выполнения задачи? – Michael