应用首次启动时在何处放置网络请求

时间:2018-01-23 10:33:19

标签: ios swift networking alamofire

当应用程序启动时,我需要做一些网络请求。例如,App获取我的服务器公钥以操作安全的restful连接。如果它可以获得密钥,它会执行其他网络操作。我的问题是这些操作是嵌套的,所以一个完成,另一个开始但是如果其中一个有问题我需要显示一条消息。我有AppDelegate类和SplashViewController,我可以在其中执行这些操作。我不确定在这样做时速度方面最好的方法是什么;

1-)在AppDelegate中启动操作并通知,通知splashviewcontroller并显示消息如果有错误。

2-)在SplashViewController类中启动操作。

3-)在打开SplashViewController之前等待所有网络操作完成(我不确定我是否可以在AppDelegate类中显示错误消息)

我在AppDelegate运行的示例代码;

 APIClient.checkCMS { (result) in
  switch result{
    case .error(let error):
        print(error)
        //Notify SplashViewController?
    case .success(let returnedObject):
        print(returnedObject)
        print("Devam")
               }
  }

2 个答案:

答案 0 :(得分:2)

您甚至考虑在此处使用通知在视图控制器之间进行通信这一事实可能是代码味道。我认为AppDelegate方法肯定是错误的。

我正在对您的应用程序做出一些可能不正确的假设,即您正在使用storyboard / xibs,并且您的SplashVC将在应用程序运行时进行实例化并显示,而不管网络调用的状态如何(即,在知道网络呼叫的结果之前,应用程序不会一直挂起。)

在这种情况下,如果您从AppDelegate拨打电话,则会使用NSNotificationCenter更新SplashVC。这似乎是一个坏主意,只是因为它给设计带来了不必要的复杂性。如果您在代码中手动加载VC,您可能只能想象AppDelegate执行所有操作,但即使这样,您可能也不希望应用程序在网络调用完成之前不显示任何内容

我处理的方式如下:

  1. (如果您还没有这样做)将所有网络请求封装到某种服务对象中。然后,您可以将依赖注入与单例范围一起使用(可能使用Swinject或其他类似的库)。这将允许您从应用程序中的任何位置发出网络请求。

  2. 首先加载默认VC(可能是SplashVC或其他根VC),依赖项从1开始注入网络服务

  3. 在SplashVC的viewDidLoad拨打电话。适当处理错误,(通过显示警报,或通过呈现自定义模式VC,或任何您喜欢的。这可以避免如果请求很慢,应用程序只显示黑屏)。

答案 1 :(得分:1)

通常,开发人员会创建一个虚假的闪屏。它看起来像飞溅,因此用户无法发现任何差异。在控制器初始化程序(或viewDidLoad)中,您可以下载所有需要的数据,并在完成所有操作后转到下一个控制器。更重要的是,您可以选择接下来的位置(例如,如果用户之前已登录,则应将其重定向到主页面。)