一.引
private func _insert(_ disposable: Disposable) -> Disposable? {
_lock.lock(); defer { _lock.unlock() }
if _isDisposed {
return disposable
}
_disposables.append(disposable)
return nil
}
上述代码 在RxSwift里DisposeBag.swift 文件的第50行,函数作用不管Rx里它是什么作用,它就是在一个数组里插入一个对象。要保证线程安全加入了_lock(lock是一个RecursiveLock。加入了插入成功的条件,_isDisposed为true的时候。
二.理解
为了体现defer的作用,把defer删掉,代码如下
private func _insert(_ disposable: Disposable) -> Disposable? {
_lock.lock();
if _isDisposed {
_lock.unlock()//---
return disposable
}
_disposables.append(disposable)
_lock.unlock()//---
return nil
}
这显然不够elegant,swift引入了defer关键词,意思是推迟,看个例子
func a{
print("1")
b()
print("4")
}
func b() {
print("2")
defer { print("-------") }
print("3")
}
打印的结果是
1, 2, 3, -------, 4
打印了2之后并没有打印----分隔符,而直接打印了3,所以,defer延迟到这个方法结束前自动执行。
回归头看引子的代码,这样保证了lock解锁,一个defer实现了我们在OC里的处理方式,很优雅!
同样可以在tableView的beginUpdate()和endUpdate()使用,以及fileOpen等等
3.注意
要注意的是 defer要放在Return之前才会在方法结束前调用
网友评论