dispatch_once替代方案-懒加载

OC中用来保证代码块只执行一次的dispatch_once在swfit中已经被废弃了,取而代之的是使用static let,let本身就带有线程安全性质的.

例如单例的实现.

1
2
3
4
final public class MySingleton {
static let shared = MySingleton()
private init() {}
}

但如果我们不想定义常量,需要某个代码块执行一次呢?

1
2
3
4
5
private lazy var takeOnceTime: Void = {
// 代码块...
}()

_ = takeOnceTime

定义一个懒加载的变量,防止在初始化的时候被执行.后面加一个void,为了在_ = takeOnceTime赋值时不耗性能,返回一个Void类型.

lazy var改为static let也可以,为了使用方便,我们用一个类方法封装下

1
2
3
4
5
6
7
8
9
10
11
class ClassName {
private static let takeOnceTime: Void = {
// 代码块...
}()
static func takeOnceTimeFunc() {
ClassName.takeOnceTime
}
}

// 使用
ClassName.takeOnceTimeFunc()

这样就可以做到和dispatch_once一样的效果了.