Just My Life & My Work

我所使用的整合開發環境是Xcode,每年更新都會釋出新的功能,來幫助開發人如我者更有效率地工作!2018年Xcode即將邁入第10版,這裡我想要來介紹主線程檢查器 (Main Thread Checker)

回想2012年我還是個初學者的時候,還不知道主線程的重要性,以致於有時候發生不預期的反應,實在摸不著頭緒!基本上要記住,改變畫面的動作要在主線程實現,不然會發生什麼事?有時候有反應,有時候沒反應,這種狀況debug超級困難呢!

[Xcode] 主線程檢查器 (Main Thread Checker)1

好在Xcode已經能從語法分析來得知,哪些程式碼會跑到非主線程,若改變畫面的元件在非主線程操作,Xcode就會有紫色的提示。上圖表示Label一定要在主線程使用 ([UILabel text] must be used from main thread only)。

點擊紫色的提示可以進入更詳細的說明頁⋯⋯

[Xcode] 主線程檢查器 (Main Thread Checker)2

Apple開發者文件這麼說:

Main Thread Checker

Detect invalid use of AppKit, UIKit, and other APIs from a background thread.

Overview
The Main Thread Checker is a standalone tool for Swift and C languages that detects invalid usage of AppKit, UIKit, and other APIs on a background thread. Updating UI on a thread other than the main thread is a common mistake that can result in missed UI updates, visual defects, data corruptions, and crashes.

How the Main Thread Checker Works
At app launch, the Main Thread Checker dynamically replaces the implementations of methods that should only be called on the main thread with a version that prepends the check. Methods known to be safe for use on background threads are excluded from this check.

Note

Unlike other code diagnostic tools, the Main Thread Checker doesn’t require recompilation, and can be used with existing binaries. You can run it on a macOS app without the Xcode debugger, such as on a continuous integration system, by injecting the dynamic library file located at /Applications/Xcode.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib.

原以為推播無關此問題,Xcode「熱心」地跟我提示,才讓我解除沒有推播出現的問題!

[Xcode] 主線程檢查器 (Main Thread Checker)3

我們來看一下這個推播方法:

[UIApplication scheduleLocalNotification:]

我測試的時候設定中斷點,可以發現左方有Thread群,唯一的主線程就是Thread 1,其他都算是非主線程。圖中Thread 25表示背景執行的非主線程,所以Xcode有紫色的提示。

[Xcode] 主線程檢查器 (Main Thread Checker)4

上圖是在主線程Thread 1,所以同樣的推播方法就不會有紫色的提示。若不是在主線程,就強制轉換到主線程吧!

多注意線程的切換時機,如此就能避免不預期的反應囉!

參考:彼得潘 – Xcode 9 的 Main Thread CheckerMain Thread Checker

廣告

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: