可以在 App Delegate 中调用 Web 服务吗?
Posted
技术标签:
【中文标题】可以在 App Delegate 中调用 Web 服务吗?【英文标题】:Is it okay to call a web service in App Delegate? 【发布时间】:2011-09-15 18:53:35 【问题描述】:我在这里有点进退两难。我有一个将 UINavigationViewController 作为 rootViewController 的应用程序。据我所知, UINavigationViewController 在实例化时需要一个 rootViewController。问题是,我有几个 UIViewController 可供选择,而选择取决于从 Web 服务返回的数据。
这是否意味着我应该在 AppDelegate 中调用 Web 服务,并且只有在获得数据后才实例化 UINavigationViewController?
我还考虑过创建一个包装器 UIViewController,其中包含 UINavigationViewController 及其作为子视图的视图。但看起来嵌套视图控制器有一些缺点,主要是在生命周期和旋转方面。
有没有更好的方法来做到这一点?谢谢!
更新:我的同事推荐了另一种可能是最干净的解决方案。在这里,AppDelegate 加载了一个“引导程序”ViewController,其主要目的是从 web 服务中提取数据并可能显示一个加载指示器。获取数据后,它将自行移除并添加具有适当根目录的 Navigation 控制器。
【问题讨论】:
也许推送一个带有“等待数据...”视图的视图控制器,然后当网络响应到达时弹出它并推送适当的视图控制器? @meggar,这正是我同事推荐的!把它放在一个答案中,我会接受你的答案。 :) bootstraper 的思路还不错,确定好加载方式后,可以更改窗口的rootViewController。 【参考方案1】:也许推送一个带有“等待数据...”视图的视图控制器,然后当网络响应到达时弹出它并推送适当的视图控制器?
【讨论】:
【参考方案2】:Web 服务调用可能需要一段时间。在 Web 需要花时间做出响应时冻结 UI 是一个非常糟糕的主意。加载带有旋转轮和“请稍候...”通知的视图控制器(和视图),启动服务调用,然后一旦服务响应,将其替换为真实的东西。
【讨论】:
【参考方案3】:UINavigationController 有一个可以设置的名为 viewControllers 的属性。见http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instp/UINavigationController/viewControllers。
// after your web service returns
navigationController.viewControllers = [NSArray arrayWithObject:yourNewController];
如果在 Web 服务返回之前您不打算在导航控制器中显示任何内容,那么您可以等到它返回后再创建导航控制器。如果您想在导航控制器中显示不同的视图控制器
【讨论】:
以上是关于可以在 App Delegate 中调用 Web 服务吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 App Delegate 上调用服务器后如何更改根控制器?
从 App Delegate 调用 ViewController 的方法
App Delegate 的应用程序:didReceiveLocalNotification:未调用
Google Sign In 调用 App Delegate 中的方法后关闭 View Controller (iOS / Swift)