2012-08-25 60 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

相關問題