Swift3中的GCD

在swift3中苹果重写了dispatch的API,让开发者使用更加方便了

下面是使用方法:

  • dispatch_after
public extension DispatchQueue {
private static var _onceTracker = [String]()
/// 实现Swift3中取消的dispatch_once
///
/// - Parameters:
/// - token: 一个唯一化的字符串,可以自定义也可以使用UUID. eg. NSUUID().uuidString
/// - block: 只需执行一次的代码
public class func once(token: String, block:(Void)->Void) {
objc_sync_enter(self); defer { objc_sync_exit(self) }
if _onceTracker.contains(token) {
return
}
_onceTracker.append(token)
block()
}
/*
上述方法有一个官方的解决方案:
Dispatch The free function dispatch_once is no longer available in Swift. In Swift, you can use lazily initialized globals or static properties and get the same thread-safety and called-once guarantees as dispatch_once provided. Example:
static let doOnce = { … global contains initialization in a call to a closure … }()
_ = doOnce // using myGlobal will invoke the initialization code only the first time it is used.
*/
}
  • 自定义队列
//这是官方文档的初始化方法
convenience init(label: String, qos: DispatchQoS = default,
attributes: DispatchQueue.Attributes = default,
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = default,
target: DispatchQueue? = default)
// 没有传参数的时候默认创建串行队列,async异步执行,所以他会开一条线程
DispatchQueue(label: "my_queue").async {
// do something
}
//传入attributes为.concurrent时创建并行队列,异步执行,所以他会开多条线程
DispatchQueue(label: "concurrent_queue", attributes: .concurrent).async {
// do something
}

关于GCD有人总结了一个口诀,总结的很好:

同步不开异步开,串行开1条,并行开多条。

队列中的任务同步执行,队列就不具有开启线程的能力, 队列中的任务异步执行,队列就具有开启线程的能力。
(同步和异步执行决定的是否有开启线程的能力)

如果队列具 有开启线程的能力 (队列任务异步执行) 且队列是 串行队列 ,那么将会 开启 1 条线程 。
如果队列具 有开启线程的能力 (队列任务异步执行) 且队列是 并发队列 ,那么将会 开启 多 条线程 。开启线程的条数由 GCD 决定。
( 串行和并发决定的是开几条线程 )