【问题标题】:How to load data from web-service while displaying splash screen?如何在显示启动画面时从 Web 服务加载数据?
【发布时间】:2012-10-04 07:18:18
【问题描述】:

我想在我的应用启动时从网络加载一些数据。我设置了一个启动画面,并在 didFinishLaunchingWithOptions 中设置了 sleep(10)。现在我希望在这个时间间隔内,我的应用程序调用 Web 服务并加载数据,但我无法做到这一点。请帮助我或提出任何建议。

【问题讨论】:

  • 在你的窗口上添加一个与启动画面相同的图像视图并将其放在前面,一旦网络服务完成,将其删除..

标签: iphone objective-c ios xcode splash-screen


【解决方案1】:

在睡眠期间,线程(在本例中为主线程)无法执行任何操作。

我建议您只显示初始屏幕,开始加载数据并在加载所有数据后隐藏初始屏幕。

【讨论】:

    【解决方案2】:

    大问题!

    首先,不要让主线程休眠,在那里什么都做不了,所以只是在浪费时间。

    相反,设置类似更新页面的东西,不断运行 UIScrollView,只有在获取数据后才会消失。

    使用 Web 服务的委托,通过它您可以在 AppDelegate 中调用一个函数来删除加载器视图并添加 HOMEPAGE,当数据已被提取时。

    类似的,

    这只是一个例子......

    - (void) webserviceDidFinishLoading  //write in appdelegate.m
    {
          [self.activityIndicatorView removeFromSuperView];
          self.window.rootController = self.homeViewController;
    }
    

    希望这会有所帮助! :)

    【讨论】:

      【解决方案3】:

      嘿,伙计,请看下面的代码..

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
          if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
          {
              splashView = [[UIImageView alloc] initWithFrame:iphoneFrame];
              splashView.image = [UIImage imageNamed:@"Default"];
              [self.window addSubview:splashView];
              //// load you web-service here and get data. After 2 sec iphone rootview controller will display
              [self performSelector:@selector(loadViewIphone) withObject:nil afterDelay:2.0];
           }
      }
      
      -(void)loadViewIphone 
      {
          [splashView removeFromSuperview];
      
          self.window.rootViewController = self.tabBarController;
          [self.window makeKeyAndVisible];
          CATransition *animation = [CATransition animation];
          [animation setDelegate:self];   
          [animation setType:kCATransitionFade];
          [animation setDuration:0.5];
          [animation setTimingFunction:[CAMediaTimingFunction functionWithName:
                                        kCAMediaTimingFunctionEaseInEaseOut]];
          [[self.window layer] addAnimation:animation forKey:kAnimationKey];
      }
      

      希望对你有帮助……

      :)

      【讨论】:

      • 这种方法有什么缺点吗?
      • 这不是正确的方法。你不知道其余的api调用或任何后台进程是否肯定会在睡眠时间内完成。
      • @K.K 它在 XCode 4.* 中完美运行,这是正确的答案。如果您有任何其他答案,请在此处发布。
      【解决方案4】:

      休眠主线程并长时间显示启动画面不是一个好主意。您可以通过遵循一个简单的技巧来实现相同的目标。我认为在您的情况下,服务是在隐藏启动画面后从第一个视图控制器调用的。因此,您可以创建一个包含相同图像的模式视图,如启动屏幕。并显示如下:

      SLSDummySplash *dummySplash = [self.storyboard instantiateViewControllerWithIdentifier:@"splashId"];
      [self presentViewController:dummySplash animated:NO completion:nil];
      

      当您完成服务调用/长时间加载事件后,只需关闭模式视图。

      【讨论】:

        【解决方案5】:

        请看这里:https://github.com/k06a/LaunchScreenViewController

        在应用的第一个视图控制器出现之前显示启动视图控制器。当您完成从 Web 加载数据或初始化后,关闭启动视图控制器。

        在特定时间后休眠或执行选择器不是正确的方法,因为由于互联网连接不佳,您永远不知道要等待多少时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-21
          • 2013-02-02
          • 2015-10-07
          • 1970-01-01
          • 2016-09-12
          • 2010-12-02
          • 2018-07-16
          • 1970-01-01
          相关资源
          最近更新 更多