2016-02-13 4 views
4

У меня есть функция выполнения сетевой задачи в 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, то есть когда мой сетевой запрос будет завершен. Могу ли я это сделать, если да, то как?

+1

Чего вы пытаетесь достичь? Что для вас означает «ложь»? Если вы не вернете 'true', пока фоновый процесс не будет завершен, он заблокирует основной поток, и приложение окажется невосприимчивым. Можете ли вы описать, что вы хотите, во время выполнения фоновой задачи? – Michael

+0

@ Майкл Я не против пользовательского интерфейса, чтобы выглядеть невосприимчивым во время выполнения фоновой задачи. Я просто хочу «вернуть истину» в мое закрытие. Как я могу называть это 'return true' внутри закрытия, т. Е. В указанных точках, которые находятся внутри тела закрытия? –

+0

Вы не можете. Если вы вернетесь в закрытие, это закрытие, которое возвращается, а не основная функция. Вы видели бы это более очевидно, если бы закрытие было отдельной функцией. Вам нужно отобразить что-то во время фоновой задачи, иначе у вас будет только черный экран, и пользователь будет задаваться вопросом, почему ваше приложение не запускалось. Что делать, если для завершения задачи требуется минута? Что не так с возвратом 'true' сразу во время выполнения задачи? – Michael

ответ

1

Вы не можете использовать блок завершения для создания возвращаемого значения для вышеуказанного метода.

Из приведенного выше кода кажется, что вы хотите переключать экраны на основе данных с сервера во время запуска. И вы не хотите показывать контроллер панели табуляции, пока происходит вызов. Что вы можете сделать, так это иметь диспетчер представлений заставки (или простой индикатор активности на экране) и установить его в качестве контроллера корневого представления до тех пор, пока запрос не будет завершен.

+0

Точно, о чем я смутился! –

Смежные вопросы