2013-03-02 64 views
0

我有一個需求,我需要在應用程序進入後臺狀態時創建並啓動一個線程。創建的線程的功能是從本地數據庫獲取數據並上傳到服務器,並且我不需要在UI上進行任何更新。我的問題是:當iOS應用程序進入後臺狀態時啓動線程

  1. 我究竟應該在哪裏創建線程 - 無論是在applicationWillResignActive方法或applicationDidEnterBackground
  2. 這是創建線程的最佳方式 - way或GCD或Posix Way?

這個事情我已經試過

  1. 我已經工作在Android上,所以我知道我能做到這一點的場景,但我是新來的iOS,所以我變得有點糊塗了開始。
  2. 我剛剛嘗試過使用NSThread概念,但它不起作用。下面是代碼,我寫信給我所知:

    - (void)applicationWillResignActive:(UIApplication *)application { 
        [NSThread detachNewThreadSelector:@selector(FetchReportFromDBAndUpload) toTarget:self withObject:nil]; 
    } 
    
    - (void)FetchReportFromDBAndUpload { 
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
        //Check for internet connection and fetch data from DB and upload to server 
        [pool release]; 
    } 
    

是創建線程的這種正確的方法,或者我需要做一些改變?如果不是,請指導我如何實現這一目標。在此先感謝

回答

1

您必須從AppDelegate的applicationDidEnterBackground:方法調用UIApplication類的beginBackgroundTaskWithExpirationHandler:方法。此方法將您的任務標記爲後臺任務,以便系統在應用程序進入後臺狀態時不會終止它。 (請注意,與VoiceIP無關,播放音樂,GPS跟蹤的後臺任務仍然受限於大約10分鐘的後臺執行時間,即它們不會永遠運行。)

下面是更詳細的信息和一個代碼示例:http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

+0

謝謝Daniel,你能解釋我多一點嗎?你能給我一個代碼片段嗎? – RockandRoll 2013-03-02 13:21:28

+0

@SunilHavnur在調度長時間運行的任務之前,您需要從'applicationDidEnterBackground:'方法調用'beginBackgroundTaskWithExpirationHandler:'。請參閱我鏈接到的文章中的清單3-3。 – 2013-03-02 13:28:09

+0

好的,謝謝..我明白了.. – RockandRoll 2013-03-02 13:30:30

相關問題