美文网首页
学习笔记-defer关键字

学习笔记-defer关键字

作者: iPhone贴膜小哥 | 来源:发表于2018-03-22 17:39 被阅读10次
    一.引
    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关键字

          本文链接:https://www.haomeiwen.com/subject/zizaqftx.html