在 main queue 執行 - Swift 3 調整記


引言

這在開發日常應該經常碰到:當 http request 返回時,必須要在 main queue 裡面更新 UI

那這篇就是來講怎麼用 swift 讓程式碼的執行緒切換到 main queue 上。

原本的寫法

dispatch_async(dispatch_get_main_queue()) {
    // 程式碼片段 ...
}

這個寫法有點像 C 的全域 function 的寫法,在執行 dispatch_async 這個 function 的同時,透過另外一個 function 取得 main queue ,於是再把要做的事情包成 closure 作為參數傳入這個 function 。

這大概是從 GCD 出廠以來,變更最少的寫法之一。

Swift/iOS 10 之後的寫法

取用的方法直覺很囉,而且不囉唆很多:

DispatchQueue.main.async {
    // 程式碼片段 ...
}

取用 main queue 的方式也從原本的 dispatch_get_main_queue() 很冗長的方式,改成取用 DispatchQueuemain 就可以在 main queue 上執行。

除了閱讀上可能會比較容易理解之外,撰寫時的自動完成速度等可能也會變得比較快。

心得和小結

從 Objective-C 轉換到 Swift 時, 寫 GCD 相關的程式碼,也是令我比較困擾的地方。

當 Xcode 6 剛出來的時候,到 Xcode 7 對於自動完成有稍微改善之前,

原始的 C 相關的 syntax 要自動完成變得不是很方便;再來也和 Swift 撰寫的風格不一樣。所以在寫這一類的程式碼時,寫 code 的速度就會被稍微降下來一點點:一來是他無法自動完成,二來就算是有備選,但是想要的總是不是在最前面, function 字數又非常長。

這個情形之下,又長、又複雜的呼叫方式就變得有點麻煩了。

不過自從新的 SDK 出來之後,他變得不像碎碎念的老頭:用了比較簡單的方式,讓我們可以比較快速的達到我們想要撰寫的內容。無論是自動完成或是手動完整打完 GCD 的程式碼都快了很多。

期待發現更多漂亮的寫法~