当前位置:   article > 正文

swift多线程GCD常用需求总结及工具代码_swift gcd开辟子线程

swift gcd开辟子线程

先把常用的Demo放前面,方便查找,能满足绝大多数需求,各种理论后续再补充在后面。

1.延迟执行

        let delay = DispatchTime.now() + .seconds(10)//计算需要开始的时间
        print("添加了一个10秒后执行的任务")
        DispatchQueue.main.asyncAfter(deadline: delay) {
            //此处写入延迟执行的代码
            print("延迟执行代码已开始执行")
            sleep(3)
            print("延迟执行代码已执行完毕")
        }

2.线程安全锁(某一时刻只能一个线程调用)

swift3中废弃了dispatch_once,这里列举了可用的线程锁,两种方式如下

    let lock = NSLock.init()
    
    func funcMultiThread() {
        //加锁方式1,类似于oc中@synchronized,互斥锁的一种
        objc_sync_enter(self)
        print("this is multi thread func begin")
        sleep(4)
        print("this is multi thread func ended")
        objc_sync_exit(self)
        
        //加锁方式2
        lock.lock()
        print("this is multi thread func begin")
        sleep(4)
        print("this is multi thread func ended")
        lock.unlock()
    }

3.单次执行(单例)

swift3中废弃了dispatch_once,GCD中没有只执行一次的方法,只能自己生成全局静态变量自己控制只调用一次。

但对于单例,可以用如下方式替换,相比OC中实现方式:

+ (instancetype)sharedInstance {
    static LAPayRedPointManager *_sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}

Swift中要简单得多,Demo如下

class FrankObj: NSObject {
    static let shared = FrankObj()
    var name:String = "frank"
}
使用上述方法,直接调用FrankObj.shared即可生成FrankObj的单例。经本人详细测试,该写法线程安全,多次创建只返回同一地址对象。

4.开辟子线程,完成后通知主线程

    /// 异步执行,完毕通知主线程
    func func1() {
        print("当前是\(Thread.current),isMainThread == \(Thread.i
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/691565
推荐阅读
相关标签
  

闽ICP备14008679号