上代码
第一种写法
final public class SafeDispatch {
private let mainQeuueKey = DispatchSpecificKey<Int>()
private let mainQueueValue = Int(1)
private static let sharedSafeDispatch = SafeDispatch()
private init() {
DispatchQueue.main.setSpecific(key: mainQeuueKey, value: mainQueueValue)
}
public class func async(onQueue queue: DispatchQueue = DispatchQueue.main, forWork block: @escaping () -> Void){
if queue == DispatchQueue.main {
if DispatchQueue.getSpecific(key: sharedSafeDispatch.mainQeuueKey) == sharedSafeDispatch.mainQueueValue {
block()
} else {
DispatchQueue.main.async {
block()
}
}
}else {
queue.async {
block()
}
}
}
}
第二种利用DispatchQueue扩展
extension DispatchQueue {
func safeAsync(_ block: @escaping ()->()) {
if self === DispatchQueue.main && Thread.isMainThread {
block()
} else {
async { block() }
}
}
}
使用
SafeDispatch.async {
print("iOS begin")
}
DispatchQueue.main.safeAsync {
print(Thread.current)
}