中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ios在后臺 完成一個長期任務

發布時間:2020-06-26 03:22:45 來源:網絡 閱讀:7462 作者:izhuhaoDev 欄目:移動開發

         當一個iOS 應用被送到后臺,它的主線程會被暫停。你用NSThread的detachNewThreadSelector:toTarget:withObject:類方法創建的線程也被掛起了。如果你想在后臺完成一個長期任務,就必須調用UIApplication
的beginBackgroundTaskWithExpirationHandler:實例方法,來向iOS 借點時間。UIApplication的
backgroundTimeRemaining屬性包含了程序完成他的任務可以使用的秒數。如果在這個期限內,長期任務沒有被完成,iOS 將終止程序。每個對beginBackgroundTaskWithExpirationHandler:方法的調用,必須要相應的調用endBackgroundTask:方法(UIApplication的另一個實例方法)。也就是說,如果你向iOS 要更多時間來完成一個任務,你必須告訴iOS 你什么時候能完成那個任務,那時,你的程序將和其所有被暫停的線程被放入后臺。
 
          當你的程序在前臺時,UIApplication的backgroundTimeRemaining屬性等于DBL_MAX常量,這是double類型可表示的最大值(和這個值相當的integer 通常等于-1)。在iOS 被要求在程序被完全掛起之前給于更多的執行時間,這個屬性指明了在完成任務前程序擁有多少秒。
 
         在程序中你可以多次調用beginBackgroundTaskWithExpirationHandler:方法。要記住的重點是,當iOS 為你的程序返回一個token 或者任務標識(task  identifier)時,你都必須調用endBackgroundTask:方法,在運行的任
務結束時,用來標志任務結束。如果你不這么做的話,iOS 會終止你的程序。
 
        在后臺時,程序不應該執行完全的功能,也不應該處理大量數據。事實上,他們只應該完成一個長期任務。
 
比如,一個程序正在調用一個web  service  API,并且還沒有從服務器上的那個API接收到響應。在此期
間,如果程序被送入后臺,它可以請求更多的時間,直到它從服務器收到響應。一旦響應被接收,程序必須保存其狀態,并調用UIApplication的endBackgroundTask:實例方法將任務標記為完成。

下面我們看看代碼實現的步驟:

1、定義一個任務標識

 

  1. @property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backtaskIdentifier; 

2、當ios app 進入后臺時,會自動調用appdelegate的  

      - (void)applicationDidEnterBackground:(UIApplication *)application   方法,在這里我們編寫要執行的任務

  1. - (void)applicationDidEnterBackground:(UIApplication *)application 
  2.    //檢測多任務的可用性 
  3.     if ([self isMultitaskingSupported] == NO) { 
  4.         return; 
  5.     }    
  6.     //定義要完成的任務 ,開始執行,
  7. ......
  8.  
  9. //返回一個任務標識
  10. self.backtaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void){ 
  11.         // do something 。。。
  12.  
  13. //結束該任務
  14. [[UIApplication sharedApplication] endBackgroundTask:self.backtaskIdentifier];
    //將任務標識符標記為 UIBackgroundTasksInvalid,標志任務結束
  15. self.backtaskIdentifier = UIBackgroundTaskInvalid;
  16.     }];  
  17.  

 如上代碼所示,我們在使用多任務的前提,一定是我們的系統支持多任務,可見檢測任務的可用性是一項必不可少的步驟:

  1. - (BOOL) isMultitaskingSupported{ 
  2.      
  3.     BOOL result; 
  4.     if ([[UIDevice currentDevice]respondsToSelector:@selector(isMultitaskingSupported)]) { 
  5.         result = [[UIDevice currentDevice] isMultitaskingSupported]; 
  6.     } 
  7.     return result; 

 我們調用 beginBackgroundTaskWithExpirationHandler: (UIApplication的一個實例方法) 方法,為app 返回了一個token 或任務標識,那么我們必須調用   endBackgroundTask:  (UIApplication的另一個實例方法)方法來結束該任務.

在后臺任務的 完成處理者 (即beginBackgroundTaskWithExpirationHandler: 的塊函數,)中,我們結束了任務,并進行必要的清理工作。

3、當我們的app回到前臺的時候會調用- (void)applicationWillEnterForeground:(UIApplication *)application  方法,此時如果后臺任務還在進行中我們就要結束他。

 

我想原理應該已經講清楚了。本人剛學不久,不當之處敬請指出,以做修改,求共進。

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

当阳市| 四会市| 黄骅市| 垣曲县| 渭南市| 普格县| 台安县| 泽普县| 南安市| 宝鸡市| 新营市| 黎川县| 建水县| 丰原市| 昌平区| 昆山市| 霍山县| 西华县| 株洲县| 三门峡市| 庆城县| 庄河市| 固阳县| 临海市| 建宁县| 常山县| 太谷县| 聂拉木县| 买车| 陆丰市| 勃利县| 保德县| 延长县| 浦江县| 延安市| 江西省| 靖远县| 湘乡市| 民丰县| 邢台县| 长汀县|