swift3 GCD學習

這篇文章對自定義隊列的串并行,優(yōu)先級,定時器和workItem講的更為詳細,有興趣的可以直接去看

GCD精講(Swift 3)

隊列串行和并行

  func dispatchQueueAttributes() {
    let queue = DispatchQueue(label: "myQueue")
    self.queue = queue
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
    
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
  }
Paste_Image.png

執(zhí)行效果跟預期的一樣,串行執(zhí)行.如果想要并行的話,需要在初始化隊列的時候,加上一個參數(shù).

  func dispatchQueueAttributes() {
    // 自定義一個隊列
    let queue = DispatchQueue(label: "并行隊列", attributes: .concurrent)
    self.queue = queue
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
    
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
  }
Paste_Image.png

這樣就打到了一個自定義隊列并行的效果.

參數(shù) attributes是DispatchQueue.Attributes類型

DispatchQueue.Attributes

有兩個值

// 這個上面已經(jīng)用了,是讓隊列并行
 public static let concurrent: DispatchQueue.Attributes

// 這個是讓隊列先不會執(zhí)行,需要手動調(diào)用隊列才會去執(zhí)行
 public static let initiallyInactive: DispatchQueue.Attributes
  var queue: DispatchQueue?
  func dispatchQueueAttributes() {
    // 自定義一個隊列
    let queue = DispatchQueue(label: "并行隊列", attributes: .initiallyInactive)
    self.queue = queue
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
    
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
  }
  
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    queue?.activate()
  }

定義一個隊列, attributes設置為. initiallyInactive, 這個時候隊列不會被立馬執(zhí)行,需要調(diào)用隊列的activate(),隊列的任務才會被開始執(zhí)行, 默認還是串行執(zhí)行的.

Paste_Image.png

如果希望隊列需要并行執(zhí)行,又希望是自己手動調(diào)用,可以這樣初始化隊列.(iOS10以后才能用)

 var queue: DispatchQueue?
  func dispatchQueueAttributes() {
    // 自定義一個隊列
    let queue = DispatchQueue(label: "并行隊列", attributes: [.initiallyInactive, .concurrent])
    self.queue = queue
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
    
    queue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
  }
  
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    queue?.activate()
  }
Paste_Image.png

總結(jié):

  • attributes: 默認為串行
  • concurrent: 并行
  • initiallyInactive: 先不執(zhí)行,需要主動調(diào)用隊列才會執(zhí)行(串行執(zhí)行)
  • [.concurrent, .initiallyInactive] // 主動調(diào)用執(zhí)行(并行執(zhí)行)

隊列的優(yōu)先級

創(chuàng)建兩個隊列異步執(zhí)行,誰先執(zhí)行完事靠優(yōu)先級決定,誰的優(yōu)先級高,CUP就會給那個隊列分配的資源就多,就會提前完成

設置優(yōu)先級是這個設置:

DispatchQoS

優(yōu)先級順序,從高到低

userInteractive
userInitiated
default
utility
background
unspecified

關(guān)于隊列優(yōu)先級的官方文檔

在創(chuàng)建隊列和使用系統(tǒng)管理的全局隊列都可以設置優(yōu)先級.

  func dispatchQoS() {
    let queue1 = DispatchQueue(label: "隊列1", qos: .userInteractive)
    let queue2 = DispatchQueue(label: "隊列2", qos: .utility)
    queue1.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
    
    queue2.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
    
    let globalQueue = DispatchQueue.global(qos: .background)
    globalQueue.async {
      for i in 0 ... 5 {
        print("??\(i)")
      }
    }
  }
Paste_Image.png

workItem

 var workItem: DispatchWorkItem?
 workItem = DispatchWorkItem {
   print("執(zhí)行")
}

 // workItem執(zhí)行完成會在指定的線程回調(diào)這個block
 workItem?.notify(queue: .main, execute: { 
     print("執(zhí)行完成")
 })

 // 執(zhí)行
 workItem?.perform()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丸凭,隨后出現(xiàn)的幾起案子卤材,更是在濱河造成了極大的恐慌相满,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烟号,居然都是意外死亡,警方通過查閱死者的電腦和手機政恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門汪拥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篙耗,你說我怎么就攤上這事迫筑。” “怎么了宗弯?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵脯燃,是天一觀的道長。 經(jīng)常有香客問我蒙保,道長辕棚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任邓厕,我火速辦了婚禮逝嚎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邑狸。我一直安慰自己懈糯,他們只是感情好,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布单雾。 她就那樣靜靜地躺著赚哗,像睡著了一般她紫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屿储,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天贿讹,我揣著相機與錄音,去河邊找鬼够掠。 笑死民褂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的疯潭。 我是一名探鬼主播赊堪,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼竖哩!你這毒婦竟也來了哭廉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤相叁,失蹤者是張志新(化名)和其女友劉穎遵绰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體增淹,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡椿访,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了虑润。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成玫。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖端辱,靈堂內(nèi)的尸體忽然破棺而出梁剔,到底是詐尸還是另有隱情,我是刑警寧澤舞蔽,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站码撰,受9級特大地震影響渗柿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脖岛,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一朵栖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柴梆,春花似錦陨溅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雹有。三九已至,卻和暖如春臼寄,著一層夾襖步出監(jiān)牢的瞬間霸奕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工吉拳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留质帅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓留攒,卻偏偏與公主長得像煤惩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炼邀,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容