RxSwift之销毁者

  这一篇来讲一下Disposable,经过前面几章的介绍,到这里RxSwift的核心流程已经基本完全的介绍完了,但是还遗留了一个问题,就是对于序列的回收。

RxSwift对于序列是怎么回收的呢?为什么通过DisposeBag简单的一句代码就可以完成序列的回收?带着问题去探究会记忆更加的深刻,同样我们从两段经典的代码来开始。


垃圾袋回收


手动销毁

这两个的区别就是,第一个是直接丢入垃圾袋中,随着垃圾袋的销毁去销毁序列。第二个则是在想要释放的时候单独的销毁,分情况使用。

重点是来关注dipose是怎么完成销毁的,废话不多说,直接来看dipose的源码。dispose()方法是属于 observable.subscribe订阅的返回值的对象调用。所以需要看的是上图中dipose

订阅的方法,我们很明确的看到这里是直接创建了一个disposable

返回的时候将订阅和disposable作为参数去创建一个新的disposable。

create 作为Disposables的一个扩展方法,这里返回的是一个BinaryDisposable的构造函数,而且是一个Cancelable类型的。
其实这里很好理解,在日常的开发中,通常基类起名的时候用Base结尾,而以able结尾的为协议(接口),所以这里其实subscribe方法返回的是实现了disposable协议的类。


同样在源码中搜索也可以得知disposable为一个协议,只有一个dispose的方法

而在上一个截图中我们也看到了在BinaryDisposable的构造方法中,其实也只是将两个disposeble保存起来。那接下来的目标也就只有一个了,那就是dispose()方法。

我们知道在订阅的时候最终返回的是一个BinaryDisposable,所以我们需要看的是BinaryDisposable的dispose的方法,在disposable协议上方截图中的dispose就属于BinaryDisposable,在这里就将两个disposable置空。

那很明显销毁的就是订阅时候创建的self.asObservable().subscribe(observer)和disposable,这时候我们的目标其实只有一个还没有明确,那就是self.asObservable().subscribe(observer)它究竟是谁。在核心探究的时候已经提到过,subscribe的实现其实是Produce的subscribe

在这里我们可以看到是创建了一个SinkDisposer,然后通过run方法,拿到一个元组,这个元组包含的就是AnonymousObservable中创建的sink,以及创建序列时候闭包中中返回的disposable。再看setSinkAndSubscription这个方法,顾名思义,其实也就是将sink和这个disposable保存起来。

而SinkDisposer的dispose方法如下所示

可以看到的是在这里调用了sink的dispose和subscription的dispose,去Sink查看

这里其实也很简单,这个cancel是创建Sink的时候传入的,Sink又是AnonymousObservable的run方法创建的。那也就是Produce的subscribe方法中创建的SinkDisposer。这里调用SinkDisposer的dispose方法,然后销毁了sink和序列创建闭包中返回的dispose。

串起来捋一下

1销毁从BinaryDisposable开始,

2 销毁保存的SinkDisposer

3 SinkDisposer调用sink的dispose

4 sink的dispose再调用SinkDisposer的dispose确保销毁完成(sink)

5 销毁创建序列闭包中的disposable(创建序列的闭包中返回的disposable)

6 销毁订阅中的disposable(订阅中的disposable)

这样就是RxSwift关于销毁的一个流程,当然中间也有很多有意思的地方没有展开细讲。比如以下这个只让调用一次的方法,这里作为扩展带给各位。感兴趣的可以研究一下。

在函数体的内部使用加锁和|=来保证只走一次。

扩展知识1:@discardableResult  这里代表的是这个函数必须接收返回值,否则会有警告。

扩展知识2:@inline(__always) 这里则是表示如果开启了编译器优化,这里即使代码很长,也会参与到内联函数中去,当然前提是非debug模式下,还有一点是在函数体内部不能使用动态派发和递归调用。假如把__always换成never,就是不会参与内联函数。

你可能感兴趣的:(RxSwift之销毁者)