【问题标题】:can the splash screen time be configured?可以配置闪屏时间吗?
【发布时间】:2014-06-09 18:04:18
【问题描述】:

我有一个应用程序,其中用户看到的第一个屏幕具有从服务器获取的数据。该应用程序还有一个启动屏幕,在加载应用程序时会显示。

问题 根据用户的连接时间,加载数据可能需要几秒钟。在这种情况下,启动屏幕出现几秒钟,然后我只看到一个空白(黑色)屏幕再过几秒钟,然后我看到第一个屏幕。我怀疑从服务器获取数据所需的时间会出现空白屏幕。我正在寻找解决此问题的方法

问题

  • 可以配置启动屏幕显示的时间长度吗?例如,在获取数据之前,启动屏幕可能会一直显示?
  • 是否可以在加载数据时显示某种微调器而不是黑屏?

更新

这就是我加载数据的方式

  def self.fetch(client, &block)
    client.shared.headers["username"] = App::Persistence["username"]
    client.shared.headers["token"] = App::Persistence["sessionId"]
    client.shared.get('categories') do |result|
      if result.success?
        ary = result.object
        block.call(ary)
      end
    end
  end

并使用它

  def application(application, didFinishLaunchingWithOptions:launchOptions)
      @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
      Color.fetch(AFMotion::Client) do |data|
        main_controller = ColorController.alloc.initWithData(data)
        @window.rootViewController = UINavigationController.alloc.initWithRootViewController(main_controller)
        @window.rootViewController.navigationBar.barTintColor = '#DF533B'.to_color
        @window.rootViewController.navigationBar.translucent = true
        @window.rootViewController.navigationBar.tintColor = UIColor.whiteColor
        @window.rootViewController.navigationBar.setTitleTextAttributes({
            UITextAttributeTextColor => UIColor.whiteColor
        })
      end
      @window.makeKeyAndVisible

      @window.tintColor = '#DF533B'.to_color
    end

【问题讨论】:

  • 添加一个“等待”视图/视图控制器。

标签: ios ios7 afnetworking rubymotion


【解决方案1】:

可以,但不应该这样做。当您的应用程序被加载到内存中时,会显示“启动”屏幕。您可以延迟删除所有此屏幕 bij 而不是直接从 application:didFinishLaunchingWithOptions: 方法返回。 但这样做可能会导致您的应用被操作系统杀死,因为加载需要很长时间。

您最好在UIWindow 中放置一个视图,以显示您的应用正在下载数据。通过这种方式,您的用户可以看到您的应用正在做某事。如果可以在这里展示一些进步,那就更好了。

您甚至可以在执行网络调用的视图控制器中执行此操作,只需在开始网络调用之前将加载视图推送到视图上。完成后删除视图。这仅在网络调用未阻止任何 UI 更新时才有效。

【讨论】:

  • 谢谢..不知道应用商店的限制。所以,比如说,我有一个简单的视图,在 UIWindow 中带有“正在加载”这个词......我如何才能在从服务器加载数据时显示它?我正在使用 AFNetworking 加载数据。
  • 这完全取决于你的代码,没有基因方法可以做到这一点。而且不是AppStore的限制,iOS会杀掉不及时启动的应用。
  • 听起来不错。我已经用一些代码更新了这个问题,这些代码显示了我如何加载数据然后显示我的控制器。如果它有助于进一步...
  • 不建议在应用程序中执行任何阻塞调用:didFinishLaunchingWithOptions 除了设置 UIWindow 之外。我还建议不要向 UIWindow 添加视图,而是将 rootViewController 设置为加载视图。
  • 如果我不在didFinishLaunchingWithOptions 中做,那么我应该在哪里做呢?我唯一的选择是先向用户显示静态控制器然后从服务器加载数据吗?
【解决方案2】:

“启动画面”或您设置为 Default.png 的内容不能设置得更长。它仅在您的应用启动之前显示。您也正确地认为您的应用程序停留在黑屏上,因为获取可能需要很长时间。

要解决这个问题,您可以做几件事。

  1. 将数据获取移动到除 mainThread 之外的其他线程,这样 UI 就不会被锁定,然后在数据下载完成后刷新您的视图。在这种情况下,您可以展示一个微调器或任何您想要的东西。

[self showLoadingView];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

    [self doDataFetch];

    dispatch_async(dispatch_get_main_queue(), ^{

        [self hideLoadingView];
        [self reloadView];
    });
});

  1. 在启动时在application:didFinishLaunchingWithOptions 中显示不同的控制器,然后在后台下载您的数据,完成后显示需要数据的视图控制器。

要点是您不应该在 mainThread 上获取数据。 在后台进行。这将防止 UI 锁定和应用加载时间过长。

【讨论】:

  • 我正在使用 AFNetworking 来获取数据。那应该是在后台设计的吧?
  • 我已经用显示我如何加载数据和显示控制器的代码更新了问题
  • 我知道 Objective-c 接口通常是因为它使用块,但看起来你的代码没有。对我来说 client.shared.get('categories') 做 |result|如果结果成功?似乎它会阻塞,因为它会执行 get 然后在执行 if 之前等待它完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
相关资源
最近更新 更多