可以在 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 调用方法中

从 App Delegate 调用 ViewController 的方法

App Delegate 的应用程序:didReceiveLocalNotification:未调用

Cocoa:从另一个类调用 App Delegate 方法

Google Sign In 调用 App Delegate 中的方法后关闭 View Controller (iOS / Swift)