2013-03-04 62 views
4

蘋果的"App States and Multitasking"文件(見「怎麼辦時,移動到後臺」)說保存,當應用程序被切換到後臺:調度保存操作:

保存用戶數據和應用程序的狀態信息。進入後臺時,所有未保存的更改都應寫入磁盤。這一步是必要的,因爲您的應用程序可能會因爲多種原因而在後檯安靜地死亡。您可以根據需要從後臺線程執行此操作。

當我開始分派操作時,如下圖所示,需要一些時間在applicationDidEnterBackground:上進行保存,當按下home鍵時,我沒有得到NSLog輸出。返回到應用程序後,出現NSLog輸出。

- (void)applicationDidEnterBackground:(UIApplication *)application { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self performOperation]; 
     NSLog(@"Operation finished"); 
     }); 
} 

我可以肯定的說完全執行performOperation方法還是根本中斷時,應用程序進入睡眠模式?

回答

6

確保您已將plist密鑰設置UIApplicationExitsOnSuspend設置爲否以確保調用applicationDidEnterBackground

接下來確保您開始一個長時間運行的任務。在你的情況是這樣的:

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    UIBackgroundTaskIdentifier __block bgTask = nil; 
    UIApplication *app = [UIApplication sharedApplication]; 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self performOperation]; 
     NSLog(@"Operation finished"); 
    }); 
} 

你告訴應用程序流連了10分鐘,同時完成了這種方式。在十分鐘結束時,過期處理程序被調用。

此外,您可以設置所需的背景模式鍵以獲得更多時間。有一些黑客和變化,可以讓你更多的時間使用我上面提到的東西。

+0

感謝你的代碼示例。我還有一些問題:1.是否需要UIApplicationExitsOnSuspend?我沒有設置它,調用了'applicationDidEnterBackground:'。 2.不應將'bgTask'聲明爲塊變量,並且在[self performOperation]之後的調度塊中也應該調用'[app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid;'? 3.當用戶在操作完成之前或後臺任務結束之前再次點擊應用時會發生什麼? – FrankZp 2013-03-05 07:01:08

+0

1. UIApplicationExitsOnSuspend是不需要的,除非你想改變默認行爲,我只是確保你知道它/沒有設置不同的W/O知道等等。2.你是正確的,bgTask應該是一個塊變量我做了編輯。 3.如果用戶進入前臺,則不會調用預定的到期處理程序,因爲backgroundtask沒有過期。 ApplicationDidEnterForeground被調用。您在調度隊列上執行的操作不會受到影響,因爲應用程序在所有這些操作期間保持活動狀態,它將根據需要繼續進行。 – 2013-03-06 17:10:25

0

我會用一種不同的日誌記錄的只是要確定:

Flexible iOS Logging

通過添加該記錄到你的項目,你可以檢查你的項目的日誌,不管你是去調試或不到組織者 - >設備 - >「您的設備」 - >控制檯。

我認爲這是最好的方法,當我不確定我是否可以調試某些東西時,它幫助了我很多。