大神链接
队列
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)
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()