iOS保持主线程异步操作

上代码

第一种写法

 final public class SafeDispatch {

    private let mainQeuueKey = DispatchSpecificKey()
    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)
  }

代码参考于Yep

你可能感兴趣的:(iOS保持主线程异步操作)