当应用程序也在后台时,从后台线程更新UI以在下一个简历中显示启动画面

时间:2014-11-18 05:17:20

标签: ios nstimer splash-screen background-thread

当应用程序在后台停留超过3分钟时,我想显示启动画面。我启动了Background计时器来触发将处理UI更新的函数。

- (void)applicationDidEnterBackground:(UIApplication *)
if (application.applicationState == UIApplicationStateBackground) {
    UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
    UIApplication *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
    //and create new timer with async call:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        splashTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerFired) userInfo:nil repeats:NO];
        [[NSRunLoop currentRunLoop] addTimer:splashTimer forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    });
}
}

现在,当调用计时器时,我调用该函数来更新我的UI,即在窗口中添加图像,使其看起来像是一个启动画面。

  - (void)timerFired
    {
      [splashTimer invalidate];
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            UIImageView *splash = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Splash_Screen.png"]];
            splash.frame = self.window.bounds;
            [self.window addSubview:splash];
        }];
}

然后在应用程序再次输入前景时从窗口中删除此图像

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if ([[self.window subviews] count] > 1) {
        [NSThread sleepForTimeInterval:1.0];
        [[[self.window subviews] lastObject] removeFromSuperview];
    }
}

但是当我从后台线程调用它时,我的Splash Screen没有显示。我尝试了一切,但没有运气。我的问题是我的计时器是从后台线程调用的,如果我想从这个线程添加图像,UI不会更新。任何帮助?

1 个答案:

答案 0 :(得分:1)

当所有后台任务都已过期/结束时,Springboard不会更新您应用的快照[1]。 IIRC当您的应用程序在后台时,快照仅在您的应用程序在处理这些后台事件后暂停之前更新:

  • 后台获取/刷新
  • 远程通知
  • (我不记得第三个。背景下载可能吗?)

[1]任务切换器中显示的图像以及应用程序移回前台时的图像。