GCD

118 阅读2分钟

大神链接

队列

  • 主队列,只在主线程
let main = DispatchQueue.main
  • 串行队列
let serialQueue = DispatchQueue(label: "com.swift.demo.serial")
  • 并行队列
let concurrentQueue = DispatchQueue(label: "com.swift.demo.concurrent", qos: .default, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
  • 全局并发队列
let globalQueue = DispatchQueue.global()
let globalQueue = DispatchQueue.global(qos: .default)
  • qos 优先级
userInteractive
default
unspecified
userInitiated
utility
background

任务

  • 迭代任务,更高效的更全面的利用手机性能来遍历,不同线程遍历
let intArray = [1,2,3,4]
DispatchQueue.concurrentPerform(iterations: intArray.count) { (index) in
            NSLog("迭代任务 \(index) = \(Thread.current)")
}
  • 同步任务,不会开辟线程,有可能阻塞当前线程
queue.sync {
	NSLog("\(Thread.current)")
}
  • 异步任务,不会阻塞当前线程,会开辟一个线程
serialQueue.async {
	NSLog("\(Thread.current)")
}

任务+队列

  • 串行队列+同步,当前线程依次执行
serialQueue.sync {
	NSLog("串行队列同步1 \(Thread.current)")
}
serialQueue.sync {
	NSLog("串行队列同步2 \(Thread.current)")
}
serialQueue.sync {
    NSLog("串行队列同步3 \(Thread.current)")
}
串行队列同步1 <NSThread: 0x6000034a48c0>{number = 1, name = main}
串行队列同步2 <NSThread: 0x6000034a48c0>{number = 1, name = main}
串行队列同步3 <NSThread: 0x6000034a48c0>{number = 1, name = main}
  • 串行队列+异步,开辟一个线程,所有任务只在这个线程依次执行
serialQueue.async {
	NSLog("串行队列异步1 \(Thread.current)")
}
serialQueue.async {
	NSLog("串行队列异步2 \(Thread.current)")
}
serialQueue.async {
	NSLog("串行队列异步3 \(Thread.current)")
}
串行队列异步1 <NSThread: 0x6000011f0280>{number = 3, name = (null)}
串行队列异步2 <NSThread: 0x6000011f0280>{number = 3, name = (null)}
串行队列异步3 <NSThread: 0x6000011f0280>{number = 3, name = (null)}
  • 并行队列+同步,在当前线程顺序执行,并不开启线程
concurrentQueue.sync {
	NSLog("并行队列同步1 \(Thread.current)")
}
concurrentQueue.sync {
	NSLog("并行队列同步2 \(Thread.current)")
}
concurrentQueue.sync {
	NSLog("并行队列同步3 \(Thread.current)")
}
并行队列同步1 <NSThread: 0x600001b9c880>{number = 1, name = main}
并行队列同步2 <NSThread: 0x600001b9c880>{number = 1, name = main}
并行队列同步3 <NSThread: 0x600001b9c880>{number = 1, name = main}
  • 并行队列+异步,在开启多个线程无序执行
concurrentQueue.async {
	NSLog("并行队列异步1 \(Thread.current)")
}
concurrentQueue.async {
	NSLog("并行队列异步2 \(Thread.current)")
}
concurrentQueue.async {
	NSLog("并行队列异步3 \(Thread.current)")
}
并行队列异步3 <NSThread: 0x600000ebfa40>{number = 4, name = (null)}
并行队列异步1 <NSThread: 0x600000edcd00>{number = 5, name = (null)}
并行队列异步2 <NSThread: 0x600000edcac0>{number = 6, name = (null)}

一些小例子

  • 异步执行完多个任务后在执行某个特定任务
let concurrentQueue = DispatchQueue(label: "com.swift.gcd.concurrent", qos: .default, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
let barrierTask = DispatchWorkItem(qos: .default, flags: .barrier) {
	NSLog("播放 \(Thread.current)")
}
concurrentQueue.async {
	NSLog("下载视频 \(Thread.current)")
}
concurrentQueue.async {
	NSLog("下载音频 \(Thread.current)")
}
concurrentQueue.async(execute: barrierTask)
下载视频 <NSThread: 0x60000378d940>{number = 4, name = (null)}
下载音频 <NSThread: 0x600003790c80>{number = 7, name = (null)}
播放 <NSThread: 0x600003790c80>{number = 7, name = (null)}
  • 倒计时
var num = 5
let timer = DispatchSource.makeTimerSource(flags: [], queue: .global())
timer.schedule(deadline: .now(), repeating: 1)
timer.setEventHandler {
	num = num - 1
    if num < 0 {
    	timer.cancel()
    } else {
        print("倒计时 \(num)")
    }
 }
timer.resume()