Swift 3 裡的 GCD

Xcode中 8 正式版已經發佈,我要在第一時間遷移我的專案到 Swift 3 —— 畢竟這是趨勢。

在遷移的過程當中我遇到了很多問題——比如 Xcode 提供的自動遷移工具根本沒有用,在我等待了兩個多小時之後,我放棄了,選擇手動遷移——畢竟,Xcode 的自動校正也是很好用的。

然而——在遷移過程當中,Xcode 一直處在 「indexing」 中,功能也不怎麼全...... 可能是由於 Swift 3 在演進的過程當中進行了多次語法的修改,所以很多地方的語法都是來回地修改——最終的結果就是變成一個無法自動校正的錯誤。

好吧,最終還是得手動來修改,所以這裡來記錄一下最常用的 GCD 的更改內容。

DispatchQueue

首先,dispatch 的全域函數不再寫為底線風格的名稱了,它變成了一個更符合 Swift 風格的 DispatchQueue 的樣子。

main thread

同樣的,你不需要在去用 dispatch_get_main_queue() 來獲取主執行緒,而是 DispatchQueue.主要 ,那麼要放到主執行緒的代碼怎麼執行呢? 只需要線上程後邊使用 .async {} 即可,也就是說,大概是這樣:

而實際上,現在的 Xcode 的自動補全,是錯誤的 .asynchronously()

另:在目前的所有測試中,我發現所有寫在這個閉包裡的代碼都不會被執行——求説明求解答,如果這是個bug...... 我的所有專案還是繼續使用 Swift 2.3 好了。

優先級

說完了最基本的東西,我們再來說說其他改變了的東西,比如優先順序的名字。

我們知道,GCD 的預設佇列優先順序有四個:

  • DISPATCH_QUEUE_PRIORITY_HIGH
  • DISPATCH_QUEUE_PRIORITY_DEFAULT
  • DISPATCH_QUEUE_PRIORITY_LOW
  • DISPATCH_QUEUE_PRIORITY_BACKGROUND

現在,新的語法當中,改變了這四個不明不白的優先順序名稱為更有意義的名字:

  • .userInitialted
  • .默認
  • .utility
  • .background

當然,它們的對應關係也就是與順序相同的:

獲取一個佇列

我們使用 DispatchQueue.global() 獲取一個系統的佇列,這樣的話獲取的就是預設 .默認 優先順序的佇列了,如果要獲取其他優先順序的佇列,就使用 DispatchQueue.global(qos: .userInitiated) ,最後,我們使用 .async {} 來執行代碼:

創建一個佇列

直接用 DispatchQueue 的初始化器來創建一個佇列。最簡單直接的辦法是這樣:

複雜一點? 你可以指定優先順序以及佇列類別:

然後把代碼放進去即可:

佇列打組

對於組,現在你可以使用這樣的語法直接創建一個組:

至於使用,則是這樣的:

那麼,如果有多個併發佇列在同一個組裡,我們需要它們完成了再繼續呢?

指定時間後執行

很多時候你可能還需要讓一些代碼在指定的時間後執行,比如動畫完成後。這個任務在swift 2.3 很麻煩,不過,在3.0就不一樣了:

只需要一句話即可。

本文由 落格博客 原創撰寫:落格博客 » Swift 3 裡的 GCD

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/2040.html

關於作者

R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

發表評論

您的電子郵件地址不會被公開. 必填字段標 *