2012-10-31 86 views
0

在我的iOS應用程序中,我在後臺線程中下載了相當大量的數據。我需要做的是以某種方式檢查用戶何時重新打開應用程序,如果此任務仍在運行或者它已被取消。知道GCD線程是否正在運行

例如,如果用戶點擊主頁按鈕,然後回到應用程序,線程將繼續這是很好的。但是如果線程被操作系統破壞了會怎樣。如何在應用程序恢復時知道線程是否正在運行。

謝謝!

一些代碼:

// Starts a background thread and also allows it to run in the background if the user exits app 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    UIBackgroundTaskIdentifier bgTask = 0; 
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [self endBackgroundUpdateTask:bgTask]; 
    }]; 

// Code here to run in background 

// Tell the main thread its done, and also remove itself from background execution 
dispatch_async(dispatch_get_main_queue(), ^{ 
    NSLog(@"Done with background thread"); 
    [self endBackgroundUpdateTask:bgTask]; 
}); 

回答

0

當你的應用程序進入後臺首先任何線索,前景或背景將被暫停。當你轉換到後臺完成和清理時,你可以做一些事情來獲得少量時間......但是當你的應用程序離開屏幕時,你肯定會關閉「背景」線程。

這意味着你的下載將被暫停,你將不得不優雅地恢復和恢復你離開的地方。爲此,您應該調查iOS提供的技術,以便通知您進入後臺並允許一些額外的時間來清理並保存一些可用於恢復的狀態。

調查此:

beginBackgroundTaskWithExpirationHandler 

然後使用backgroundTimeRemaining檢查,當你試圖在授予額外的時間來完成了多少時間離開了。清楚時,您無法在分配的時間保存狀態下完成並設置一個標誌,指示您重新啓動時需要繼續或重新開始。實際上沒有其他辦法,因爲iOS沒有任何方法可以知道你是否完成了你想要做的事情,這取決於你到

+0

是的,這是真的,但看看我發佈的代碼。我已經使用beginBackgroundTaskWithExpirationHandler,並且工作正常。但是說這項任務需要比系統提供的更長的時間。那麼它會優雅地關閉線程。當用戶再次打開該應用程序時,我想檢查它是否被擊落,以便我可以再次開始下載。 – Eric

+0

好的,那麼..它相當簡單的使用:backgroundTimeRemaining來檢查你試圖完成時剩下多少時間。當它失敗時,很明顯你不會做到這一點。保存狀態,設置一個標誌,您需要在下次啓動時繼續下載並調用endBackgroundUpdateTask。真的沒有其他辦法。 –

相關問題