2012-08-25 63 views
0

在我的应用程序中,我正在下载一个方法的大量图像。如何知道任务是否在后台执行

我使用的是

downloadTask = [[UIApplication sharedApplication] 
        beginBackgroundTaskWithExpirationHandler:^{ 

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

        }]; 

这是工作的罚款,如果我按家庭或睡眠按钮,图像继续下载。

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

我一直在寻找应用程序的状态,而它的下载与屏幕关闭。

[UIApplication sharedApplication].applicationState 

状态是UIApplicationStateActive所有donwload

我如何才能知道期间,如果下载与屏幕关闭或发生了什么?

编辑完成后。接受了答案:

我刚刚发现,如果我点击主页按钮,该应用程序在UIApplicationStateBackground进入,如果我点击的唤醒/休眠进入在UIApplicationStateInactive

以下的方法正确的答案,我的应用程序在两种情况下都会重新加载。

回答

2

屏幕是关闭的两种状态(除了当应用程序尚未连开):

  • 悬浮:在这种情况下,你不必担心,因为下载在应用程序再次激活之前不会继续;它会进入这个状态
  • 背景:在进入暂停状态前它处于这种状态一段有限的时间,此时屏幕已关闭。在这里您可能需要检查是否执行您所说的所有事情,因为在此状态下代码仍然可以执行。在这种状态下,应用状态为UIApplicationStateBackground,所以你可以只进行这样的检查:

你可能想检查应用程序是否在后台执行,以实现结果。就像这样:

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更新,请记得将它们发送回主线程(因为现在下载的是不同的)。

+0

由于某些原因*代码*标记不起作用.. –

+0

但似乎使用beginBackgroundTaskWithExpirationHandler,应用程序不会进入后台模式,直到任务完成,但屏幕关闭。如果我开始下载任务并关闭屏幕,则它始终处于UIApplicationStateActive状态,并且会下载所有图像 – jcesarmobile

+0

您是否可以在主线程上下载图片? –

1

通过在指定的应用程序委托方法applicationDidEnterBackground:applicationWillEnterForeground:中设置标志,您可以检查您的应用程序是否在后台运行。例如:

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

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

如果您不希望您的应用程序委托这里面_applicationRunsInForeground标志,你可以在你的ViewController类,而不是(UIApplicationWillEnterForegroundNotificationUIApplicationDidEnterBackgroundNotification)观察委托的NSNotifications。

+0

问题是,在应用程序完成后台任务之前,不会调用applicationDidEnterBackground – jcesarmobile

+0

这是不可能的。 applicationDidEnterBackground委托方法将始终在用户点击home按钮或用户按下设备上的睡眠/唤醒按钮时调用。 – datwelk

相关问题