iOS 的看門狗機制

同步:ckitakishi.com

背景

應用 100% Loss 時完全無法啟動,一直崩潰。徹底切斷網絡連接正常啟動,調試模式狀態(tài)下等待時間非常久,但可以啟動,并伴隨 UI 微卡。強烈的預感這是線程阻塞。前一段時間被 Core Data Concurrency 折騰的夠嗆,看見線程問題就略有些心慌。

原因

首先看了 crash log,一如猜測,的確是卡在了主線程;意料之外的是,無數(shù)次閃退只留下了一份崩潰日志,如下所示:

Watch Dog

第一次見,讀了一些資料大概才算是明白了這是怎么一回事。為了避免應用陷入錯誤狀態(tài)導致界面無響應,Apple 設計了看門狗 (WatchDog) 機制。一旦超時,強制殺死進程。在不同的生命周期,觸發(fā)看門狗機制的超時時間有所不同:

生命周期 超時時間
啟動 Launch 20 s
恢復 Resume 10 s
懸掛 Suspend 10 s
退出 Quit 6 s
后臺 Background 10 min

首先說一說異常編碼,也是寓意頗深。8badf00d = ate bad food,大概是在說看門狗吃了壞的食物所以暴走了?!異常記錄則表示這并不是一次崩潰(邪魅一笑:強制退出而已)。信息一欄指出時間限制為 20 s。結合應用業(yè)務來看,表層原因在于:每次啟動應用,首先進行一次模版同步,在此之前需要檢測登錄狀況,通過 RunLoop 反復嘗試直到收到響應為止。然而不幸的是,這一些都發(fā)生在主線程。

同步網絡請求,主線程,超長超時時間,滿足這三點,一定場景下幾乎必然會觸發(fā)看門狗機制。

對策

合理解決方案:

  1. 異步網絡請求:優(yōu)點很多,最重要的是可以讓你無憂無慮安全地訪問網絡,而無需擔心線程。
  2. 在非主線程中使用同步網絡請求:如果異步運行你的網絡代碼比登天還難的話(也許你的應用是一個基于同步網絡請求的大型移植項目),退而求次,你也可以在次級線程中運行同步代碼,也可以避免觸發(fā)看門狗機制。

此外,一部分情況下,例如這次遇到登錄和模版同步時觸發(fā)看門狗,事實上,即使在運用到模版時再次請求也是勉強可行的,因此姑且先跳過網絡請求也可以。此時,還以使用一種我認為是相對比較差的方案:

  1. 通過 RunLoop 來操控一切,一旦超過既定的超時時間,就提示用戶重試或者暫時先跳過網絡請求。

應用的網絡部分基于公司的通用框架,因此優(yōu)先考慮在非主線程中進行網絡請求來避免觸發(fā)看門狗。

至于調試模式下為什么可以正常啟動應用,完全是因為該模式下看門狗機制處于禁用狀態(tài)。

此外,除了網絡操作,I/O 讀寫文件和大規(guī)模運算等耗時任務也極有可能觸發(fā)看門狗機制。合理處理線程,優(yōu)化耗時任務,很大程度能避免不佳用戶體驗。

參考:

  1. 主線程上的同步網絡請求
  2. 調試模式不發(fā)生崩潰
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,759評論 11 349
  • 國家電網公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,306評論 6 13
  • ?2016年,是我的認知元年,接觸了許多新的事物,接受了許多新的觀念。2017年,將會是一個提升認知+深入實踐的一...
    信貸評審人閱讀 689評論 0 1
  • 什么是愛情,一起來閑話吧。 1.理學大師二程、朱熹都告訴我們,“存天理、滅人欲”,合乎天理的都要存在,人性的貪婪欲...
    半夜樓主閱讀 831評論 2 1

友情鏈接更多精彩內容