赞
踩
先把常用的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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。