在我的应用程序中,我正在下载方法上的大量图像。
我正在使用
downloadTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:downloadTask];
downloadTask = UIBackgroundTaskInvalid;
}];
这个工作正常,如果我按住主页或睡眠按钮,图像会继续下载。
我在UIAlertView中的UIProgressView中显示进度,当百分比为100%时,alertView被忽略,我将viewController更改为我显示已下载图像的其他位置。 但是,如果应用程序在下载完成时非常活跃,我只希望这种情况发生。
我一直在查看应用状态,并在屏幕关闭时下载。
[UIApplication sharedApplication].applicationState
在所有下载过程中,状态是UIApplicationStateActive
如何在关闭或打开屏幕时知道下载是否正在进行?
接受答复后被删除:
我刚刚发现,如果我点击主页按钮,应用程序会进入UIApplicationStateBackground,如果我点击它在UIApplicationStateInactive中输入的唤醒/睡眠
在接近正确答案后,我的应用程序会在两种情况下都进行下载。
答案 0 :(得分:2)
屏幕在两种状态下关闭(除了应用程序尚未打开时):
您可能想要检查应用程序是否在后台执行以获得结果。就像这样:
if([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
// Do stuff
}
如果它在后台,则屏幕关闭。
UPDATE :经过几次测试后,我发现你所表现出来的行为可能是由于在主线程上执行了下载。
您应该在(例如)全局队列上发送下载。这样应用程序将按预期进入后台状态:
....
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.bti];
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self doBackgroundStuff];
});
....
这样,如果在下载过程中将应用程序放在后台,则应用程序状态将变为 UIApplicationStateBackground ,然后您可以像我最初写的那样检查它。如果您在进行过程中进行UI更新,请记住将它们发送回主线程(因为下载现在是另一个)。
答案 1 :(得分:1)
您可以通过在指定的应用委托方法applicationDidEnterBackground:
和applicationWillEnterForeground:
中设置标记来检查您的应用是否在后台运行。例如:
- (void)applicationDidEnterBackground:(UIApplication *)application
_applicationRunsInForeground = NO;
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
_applicationRunsInForeground = YES;
}
如果您不希望在应用程序委托中包含此_applicationRunsInForeground
标志,则可以在viewcontroller类中查看委托的NSNotifications(UIApplicationWillEnterForegroundNotification
和UIApplicationDidEnterBackgroundNotification
)。