作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当应用程序在后台停留超过 3 分钟时,我想显示启动画面。我启动了后台计时器来触发处理 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];
}
}
但是当我从后台线程调用它时,我的启动画面没有显示。我尝试了一切但没有运气。我的问题是我的计时器是从后台线程调用的,如果我想从该线程添加图像,则 UI 不会更新。有什么帮助吗?
最佳答案
当所有后台任务都过期/结束时,Springboard 不会更新您应用的快照[1]。 IIRC 当您的应用程序处于后台时,快照仅在您的应用程序在处理这些后台事件后暂停之前更新:
[1] 当您的应用程序移回前台时出现在任务切换器中的图像。
关于ios - 当应用程序也在后台时从后台线程更新 UI,以便在下一次恢复时显示启动画面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987085/
我是一名优秀的程序员,十分优秀!