2016-02-13 56 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

正是我所困惑的! –

相关问题