1.创建序列
示例代码1:创建序列
// 1.创建序列
let ob = Observable<Any>.create { (observer) -> Disposable in
observer.onNext(“123")
return Disposables.create { print("销毁释放")}
}
底层源码分析:
我们点击“Command + Disposables的create”进入AnonymousDisposable类:
- 继承DisposeBase基类,实现Cancelable协议。
扩展了父类的Disposables, - 定义create函数:其中dispose参数为一个闭包,在AnonymousDisposable初始化init函数中,将外界传入的闭包进行保存。
- 在dispose函数中,使用fetchOr函数:
func fetchOr(_ this: AtomicInt, _ mask: Int32) -> Int32 {
this.lock()
let oldValue = this.value
this.value |= mask
this.unlock()
return oldValue
}
fetchOr保证只调用一次_disposeAction代码块,_disposeAction中执行:(1).将_disposeAction置为nil;(2).调用外界的闭包action,及dispose。
那么dispose函数是什么时候调用的呢?我们继续分析:
2.订阅序列
示例代码2:订阅序列
let dispose = ob.subscribe(onNext: { (anything) in
print("订阅到了:\(anything)")
}, onError: { (error) in
print("订阅到了:\(error)")
}, onCompleted: {
print("完成了")
}) {
print("销毁回调")
}
print("执行完毕")
//重点:主动调用销毁dispose
dispose.dispose()
底层源码分析:
我们“Command + subscribe”进入ObservableType的subscribe函数,这里我们很熟悉了,但是这次我们关注的是dispose销毁。
- 在event的switch判断中,.error和.completed都会自动调用disposable.despose( )进行销毁操作。
- return中,构造一个Disposables.create——二元销毁者 BinaryDisposable,用于闭包回调。其实就是提供一个可外部调用的销毁函数dispose( )。
- Disposables.create中,传入两个参数:
参数1:self.asObservable().subscribe(observer):该参数实际上就是Producer中的Subscribe,返回SinkDisposer:
我们发现,又用到了sink,关联起了序列的观察者与销毁者。
参数2:disposable:为外界订阅返回的销毁者,提供dispose()函数。
上述是一系列销毁流程,那么销毁的触发操作是什么呢?那就是主动调用dispose.dispose( )发起销毁操作。
至此,整个销毁发起、执行流程已经讲述完毕。
3.总结
序列和观察者是不能直接销毁的,其生命周期是一直伴随着控制器生命周期的,直接销毁会出现致命问题。所以,只能将序列与观察者之间的联系——sink销毁掉,达到断开响应的目的,完成销毁操作。