跟上一篇同樣,這篇也主要作一些要點記錄html
一、app終止也看成app正常生命週期的一部分,若是app是被掛起的,是接收不到被終止的消息的。若是app正在運行或者app在後臺但沒被掛起,appdelegate是會接收到applicationWillTerminate:通知的。無論是用戶仍是系統要殺,通知行爲是同樣的。ios
二、應該啓動的時候當任務關係到構造正確的界面時才應該在主線程執行,其它任務都應該異步執行。app
- (void)applicationDidEnterBackground:(UIApplication *)application { bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{ // Clean up any unfinished task business by marking where you // stopped or ending the task outright. [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; // Start the long-running task and return immediately. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Do the work associated with the task, preferably in chunks. [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }); }
但注意的是不管時本身任務執行完畢或者系統告訴你申請的時間已經到了的時候必定要調endBackgroundTask:告訴系統你能夠被掛起了,無論你是否完成了你所作的任務。不然就會被系統殺掉。也能夠經過backgroundTimeRemaining知道申請的時間剩餘多少。異步
(2) 對於後臺下載可參考NSURLSession。但有些東西仍是有必要了解和備註:若是是系統掛起或者說殺死app,它纔會繼續NSURLSession的後臺任務,若是是用戶主動殺掉應用,系統會取消掉全部未完成的下載任務。async
application:performFetchWithCompletionHandler:,它會平衡全部其它應用才決定要不要調你的。這裏能夠用做檢查一些更新,配合
NSURLSession的後臺下載實現一些更好的功能。