2012-05-27 268 views
2

當應用程序進入後臺狀態時,我需要在後檯安排任務。 我必須這樣做才能每x次調用一次遠程服務,然後在遠程服務發生某些事件時顯示本地通知。 (我知道這看起來像RPN,的確是這樣,但由於某種原因,我無法使用PRM)當應用程序進入後臺時運行後臺線程

我試過這段代碼:

- (void)applicationDidEnterBackground:(UIApplication *)application{ 

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){ 
     remoteServiceCallThread = [[NSThread alloc] initWithTarget:self selector:@selector(doRemoteCall:) object:nil]; 
     [remoteServiceCallThread start]; 
    }]; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application{ 
    [remoteServiceCallThread cancel]; 
} 

我把斷點在doRemoteCall選擇,把不管用。

也許我的方法不是最好的。如果你有任何其他手段像我描述的那樣做這個操作,我會接受它。

謝謝。

回答

2

你是不是啓動線程,它的初始化代碼是在到期處理程序塊將被稱爲右側前應用程序被關閉了超時:

處理程序進行前,應用程序的簡稱爲剩餘的 後臺時間達到0.你應該使用這個處理程序來清理和 標記後臺任務的結束。未能明確結束任務 將導致應用程序終止。 處理程序在主線程中同步調用,因此在應用程序通知 時暫時阻止 應用程序暫停。

的任務應該是隻有10分鐘的活動狀態(即由iOS的驅動)如果您的應用程序不支持後臺模式(GPS,音頻,VOIP)中的一個。

您還需要保持返回的UIBackgroundTaskIdentifier引用能夠將其標記爲結束,如果用戶將應用程序置於前臺或任務時間結束時(即處理程序塊被調用時)。

+0

謝謝你的解釋。但是這並不能告訴我如何在應用程序不在前臺時設計我的解決方案來運行後臺進程。 –

+0

把代碼放在'beginBackgroundTaskWithExpirationHandler'後面,它會在應用程序通知系統需要處理後臺操作時處理。 'beginBackgroundTaskWithExpirationHandler'可能在任何地方被調用,不僅在'applicationDidEnterBackground',這樣你可以保護你的數據源操作不被終止。 –