在 iOS 開發(fā)中開發(fā)者都知道只能在主線程中進行 UI 的相關操作,以防止出現(xiàn) crash 或者是其他意外的情況.
但今天遇到一個情況是在后臺線程中調(diào)用了 [UIAPPlication delegate] 方法,被提示必須要從且只能從主線程來調(diào)用. 這就很讓人奇怪了, 這個調(diào)用和 UI 操作毫無關系吧,怎么需要被警告?
首先去查了 Main Thread Checker Apple document, 它是一個在 debug 的時候檢測 APPKit&UIKit 和其他相關的 API 有沒有在后臺線程非法使用的工具.可以不用重新編譯直接使用現(xiàn)有的二進制包進行運行.
但這個沒法解釋為什么 [UIApplication delegate] 會被報出警告.
在某個解釋的文章下面看到微博上的一個解釋微博
今天和一個蘋果的Engineer叫Kuba的討論了15分鐘他寫的新的Xcode里的Main Thread Checker。
原理很簡單,就是method swizzling,但是他的做法我表示不贊同。 Checker寫在了Debugger的C代碼中,替換掉了UIKit的1000多個Method(按照他的說法是所有的方法)。然后出現(xiàn)的問題就如下圖所示:我在Background thread去get一個ImageView中的Image property,會提示需要從主線程去操作,相同的問題也出現(xiàn)在了我從后臺線程去獲取其他的property,比如View的contentmode。
在我看來,我通過get方法去獲取property,如果不涉及對Layout或者UI element的操作而導致屏幕上需要重新繪制,所以不一定是需要從主線程進行操作的。
他最開始給出的解釋是:因為主線程在set image的時候,后臺線程可能在讀取,所以會導致問題。但是我表示反對,因為這件事情應該是由Thread Sanitizer來check是不是出現(xiàn)問題,而不是由Main Thread checker來直接檢查是不是在主線程中進行的,矯枉過正的感覺。
但是后來他說了更深層次的原因是UIKit組也不能弄清楚哪些method是線程安全的了,所以干脆就一股腦全換了。對此我表示不能信服。
「但是后來他說了更深層次的原因是UIKit組也不能弄清楚哪些method是線程安全的了,所以干脆就一股腦全換了」
這個大概就是原因了.