2016-02-13 76 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。所以不想在POINT-5處撥打return true。相反,我想在POINT-1,2,3,4處調用return true,即我的網絡請求將完成。我能做到嗎,如果是的話那怎麼辦?

+1

你試圖達到什麼目的?什麼會返回'假'對你意味着什麼?如果在後臺進程完成之前不返回'true',它將阻止主線程,並且應用程序將顯示無響應。你能描述一下你在後臺任務運行時想要發生什麼嗎? – Michael

+0

@Michael我不介意UI在後臺任務運行時看起來沒有響應。我只想在我的閉包裏面返回true。我怎樣才能在封閉體內調用這個'return true',即在封閉體內部指定的點上? –

+0

你不能。如果在閉包內部返回,則返回閉包,而不是主函數。如果封閉是一個單獨的功能,你會更明顯地看到這一點。您需要在後臺任務運行時顯示某些內容,否則只會顯示一個黑屏,用戶會疑惑爲什麼您的應用程序未啓動。如果完成任務需要一分鐘,該怎麼辦?在任務運行時立即返回'true'有什麼問題? – Michael

回答

1

您不能使用完成塊爲上述方法創建返回值。

從上面的代碼,它聽起來像你想在啓動期間基於來自服務器的數據切換屏幕。並且您不希望在呼叫發生時顯示選項卡欄控制器。你可以做的是擁有一個啓動畫面視圖控制器(或一個簡單的活動畫面指示器),並將其設置爲根視圖控制器,直到請求往返。

+0

正是我所困惑的! –

相關問題