gpt4 book ai didi

iphone - 如何知道任务是否在后台执行

转载 作者:行者123 更新时间:2023-11-28 20:30:56 33 4
gpt4 key购买 nike

在我的应用程序中,我正在使用一种方法下载大量图像。

我正在使用

 downloadTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{

[[UIApplication sharedApplication] endBackgroundTask:downloadTask];
downloadTask = UIBackgroundTaskInvalid;

}];

这工作正常,如果我按下主页或 sleep 按钮,图像会继续下载。

我在 UIAlertView 内的 UIProgressView 中显示进度,当百分比为 100% 时,alertView 被关闭,我将 viewController 更改为显示下载图像的其他位置。但我只希望在下载完成时应用程序真正处于事件状态时发生这种情况。

我一直在查看应用程序状态以及在屏幕关闭的情况下下载。

[UIApplication sharedApplication].applicationState

在所有下载期间状态为 UIApplicationStateActive

我如何知道下载是在屏幕关闭还是打开的情况下进行的?

接受答案后编辑:

我刚刚发现,如果我点击主页按钮,应用程序会进入 UIApplicationStateBackground,如果我点击唤醒/ sleep ,它会进入 UIApplicationStateInactive

按照正确答案的方法,我的应用在两种情况下都继续下载。

最佳答案

屏幕在两种状态下关闭(应用尚未打开时除外):

  • suspended :在这种情况下,您不必担心,因为在应用程序再次激活之前不会继续下载;它将在
  • 进入此状态
  • background : 在进入suspend之前在有限的时间内处于这个状态,此时屏幕已经关闭。在这里你可能想检查是否做你说的所有事情,因为在这个状态下代码仍然可以执行。在此状态下,应用状态为 UIApplicationStateBackground,因此您可以像这样执行检查:

您可能想检查应用程序是否在后台执行以获得结果。就像这样:

if([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
// Do stuff
}

如果它在后台,那么屏幕是关闭的。

更新:经过几次测试,我发现您遇到的行为可能是由于在主线程上执行下载所致。

您应该在(例如)全局队列上发送下载。这样应用程序就会按预期进入后台状态:

....
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.bti];
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self doBackgroundStuff];
});
....

这样,如果应用程序在下载过程中被置于后台,应用程序状态将变为UIApplicationStateBackground,然后您可以像我最初写的那样检查它。如果您在进程中进行 UI 更新,请记住将它们发送回主线程(因为下载现在在不同的线程上)。

关于iphone - 如何知道任务是否在后台执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122061/

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