小斑iOS程序猿iOS 开发每天分享优质文章

GCD在Swift3.0的改变

2016-12-12  本文已影响233人  cornerAnt

1.重新认识 Dispatch Queue

let queue = DispatchQueue(label: "myQueue")

同步和异步执行

   queue.sync {
      print("同步执行")
 }
    queue.async {
      print("异步执行")
 }   
    
  

2.Quality Of Service(QoS)和优先级

优先级,通过下面方法的qos参数设置

let queue1 = DispatchQueue(label: "queue1", qos: DispatchQoS.background)

3.串行与并行


let queue2 = DispatchQueue(label: "queue2", qos: .utility, attributes: .concurrent)
var inactiveQueue: DispatchQueue!

现在,初始化队列,并将其赋值给 inactiveQueue
:
let queue3 = DispatchQueue(label: "queue3", qos: .utility, attributes: .initiallyInactive)inactiveQueue = anotherQueue

使用成员属性是有必要的,因为 anotherQueue
 是在 concurrentQueues()

if let queue = inactiveQueue { 
   queue.activate()
}

4.延时执行

let queue4 = DispatchQueue(label: "queue4", qos: .userInitiated)
print(Date())
let additionalTime: DispatchTimeInterval = .seconds(2)
delayQueue.asyncAfter(deadline: .now() + 0.75) { 
print(Date())
}

5.访问主队列和全局队列

let globalQueue = DispatchQueue.global()
  globalQueue.async {        
    }

全局队列依然可以设置优先级,

let globalQueue = DispatchQueue.global(qos: .userInitiated)
DispatchQueue.main.async { 
// Do something
}

6.DispatchWorkItem 对象

DispatchWorkItem简单的来描述就是一个代码块可以在任意一个队列上被调用.

let workItem = DispatchWorkItem { 
// Do something
}

在全局队列上调用代码块

let queue = DispatchQueue.global()queue.async { 
   workItem.perform()
}

DispatchQueue 类为此目的提供了一个便利的方法

queue.async(execute: workItem)

当任务执行完毕的时候,可以通知主队列

workItem.notify(queue: DispatchQueue.main) { 
print("value = ", value)
}

总结

Swift3.0 GCD的写法变了很多,更加的间接和清晰了.

上一篇下一篇

猜你喜欢

热点阅读