0

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

我正在使用一个

 downloadTask = [[UIApplication sharedApplication]
                   beginBackgroundTaskWithExpirationHandler:^{

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

                   }]; 

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

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

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

[UIApplication sharedApplication].applicationState

在所有下载期间状态为 UIApplicationStateActive

我怎样才能知道下载是在屏幕关闭还是打开的情况下进行的?

接受答案后编辑:

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

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

4

2 回答 2

2

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

  • 暂停:在这种情况下,您不必担心,因为在应用再次激活之前不会继续下载;它将在
  • 背景:在暂停之前,它会在有限的时间内处于此状态,并且此时屏幕已经关闭。在这里您可能要检查是否执行您所说的所有事情,因为在此状态下代码仍然可以执行。在这种状态下,应用程序状态为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 更新,请记住将它们发送回主线程(因为现在下载在不同的线程上)。

于 2012-08-25T18:23:54.470 回答
1

您可以通过在指定的应用程序委托方法applicationDidEnterBackground:applicationWillEnterForeground:. 例子:

- (void)applicationDidEnterBackground:(UIApplication *)application
    _applicationRunsInForeground = NO;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    _applicationRunsInForeground = YES;
}

如果您不想_applicationRunsInForeground在应用程序委托中使用此标志,则可以在视图控制器类中观察委托的 NSNotifications(UIApplicationWillEnterForegroundNotificationUIApplicationDidEnterBackgroundNotification)。

于 2012-08-25T13:13:49.697 回答