Swift3中的 GCD

一銘發表於2017-12-13

第一次翻譯文章,水準真是不忍直視,各位輕拍..... 原文連結

######多執行緒和併發是當今APP中的必備因素,但是在 iOS SDK中,GCD作為一個管理併發操作的系統級別的API,顯得並不是那麼友好. ######Swift3中給 GCD的語法和用法帶來了不少的提升,讓我們來看看有什麼新東西.

###dispatch_async ######以前,我們選擇佇列方法(同步和非同步),然後把我們的任務分配到選擇的排程佇列中,但是新的 GCD 中反轉了這個順序,我們首先選擇佇列然後在選擇佇列方法. ######GCD最常用的模式就是在全域性佇列執行任務,然後當任務完成回到主執行緒重新整理UI.來看看新的API怎麼實現: ``` DispatchQueue.global(attributes: [.qosDefault]).async { // Background thread DispatchQueue.main.async(execute: { // UI Updates }) } ```

###Queue attributes ######你會注意到現在佇列在初始化的時候需要屬性,這是Swift中的optionSet,可以包括佇列的一些屬性,例如序列或者並行,記憶體和活動管理選項還有佇列的優先順序(.default, .userInteractive, .userInitiated, .utility and .background). ######新的佇列優先順序替換了在iOS8中被廢棄的舊的優先順序屬性,如果你要使用佇列優先順序屬性,這是在 QOS中的呼叫列表: ``` * DISPATCH_QUEUE_PRIORITY_HIGH: .userInitiated * DISPATCH_QUEUE_PRIORITY_DEFAULT: .default * DISPATCH_QUEUE_PRIORITY_LOW: .utility * DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background

######記憶體和活動管理選項( memory and activity management options)是今年蘋果在OS釋出的新技術(包括 OSX 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0).這個包括用.initiallyInactive在非活動的狀態啟動一個佇列,或者為你的執行緒設定一個自動釋放屬性(.autoreleaseInherit, .autoreleaseNever, .autoreleaseWorkItem)
<p>
###Work items
######佇列並不是GCD中唯一用到Swift OptionSet的,這是Swift中新的語法
複製程式碼

let workItem = DispatchWorkItem(qos: .userInitiated, flags: .assignCurrentContext) { // Do stuff } queue.async(execute: workItem)

######一個 work item 在初始化的時候需要宣告一個quality或者service或者flags.這些宣告的屬性都是可選值,並且影響了workItem的使用.Flags是可選set集合,包括了以下可選值:barrier, detached, assignCurrentContext, noQoS, inheritQoS, enforceQoS.
<p>
###dispatch_once
######dispatch_once 是一個在初始化的時候非常有用的程式碼,而且用以保證在初始化時執行一次某任務。
######在Swift3中,dispatch_once被廢棄了,應該被替換成了其他全域性或者靜態變數和常量.
複製程式碼

// Examples of dispatch_once replacements with global or static constants and variables. // In all three, the initialiser is called only once.

// Static properties (useful for singletons). class Object { static let sharedInstance = Object() }

// Global constant. let constant = Object()

// Global variable. var variable: Object = { let variable = Object() variable.doSomething() return variable }()

<p>
###dispatch_time_t
######dispatch_time_t是一個把具體時間轉換成UInt64的函式,這樣就可以把UInt64提供給一個佇列.新的Swift語法提供了非常友好的使用方法(再見 NSEC_PER_SEC),這是個dispatch after的簡單例子:
複製程式碼

let delay = DispatchTime.now() + .seconds(60) DispatchQueue.main.after(when: delay) { // Do something }

######.seconds 是DispatchTimeInterval這個列舉的一個新的 case.這個列舉有一個代表計數的關聯值.它現在支援:
複製程式碼
  • .seconds(Int)
  • .milliseconds(Int)
  • .microseconds(Int)
  • .nanoseconds(Int)

<p>
###dispatch_assert
######這個也是今年蘋果在OS釋出的新技術,執行緒的先決條件.這個在你執行程式碼前可以檢查當前執行緒是否是你希望的執行緒.這個常見用法就是在主執行緒重新整理UI的時候.這有個簡單例子:
複製程式碼

let queue = DispatchQueue.global(attributes: .qosUserInitiated) let mainQueue = DispatchQueue.main

mainQueue.async { dispatchPrecondition(condition: .notOnQueue(mainQueue)) // This code won't execute }

queue.async { dispatchPrecondition(condition: .onQueue(queue)) // This code will execute }


###Additional resources
####Swift3的官方文件中還有很多GCD的提升,但是文件還在編寫中.想要了解更深,戳下面
https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
https://developer.apple.com/videos/play/wwdc2016/720/
https://github.com/apple/swift-corelibs-libdispatch
複製程式碼

相關文章