gpt4 book ai didi

ios - 当应用程序也在后台时从后台线程更新 UI,以便在下一次恢复时显示启动画面

转载 作者:行者123 更新时间:2023-11-29 12:33:22 24 4
gpt4 key购买 nike

当应用程序在后台停留超过 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com