学习笔记-defer关键字

一.引
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之前才会在方法结束前调用

你可能感兴趣的:(学习笔记-defer关键字)