当应用程序在后台停留超过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不会更新。任何帮助?
答案 0 :(得分:1)
当所有后台任务都已过期/结束时,Springboard不会更新您应用的快照[1]。 IIRC当您的应用程序在后台时,快照仅在您的应用程序在处理这些后台事件后暂停之前更新:
[1]任务切换器中显示的图像以及应用程序移回前台时的图像。