// 序列
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (change) in
print("observeWeakly订阅到了KVO:\(String(describing: change))")
})
.disposed(by: disposeBag)
复制代码
observeWeakly
方法中调用observeWeaklyKeyPathFor
bash
observable
propertyAttributes
判断当前观察的对象的属性是不是
isWeak
propertyObservable:KVOObservable
->
ObservableType
,
KVOObservableProtocol
,而且保存了:
object
,
keyPath
,
options
propertyObservable .flatMapLatest
修饰过的序列,闭包保存一些容错处理。
接着开始subscribe
建立AnonymousObserver
,并经过self.asObservable().subscribe
回调到自身的subscribe()
方法闭包
observer:KVOObserver
->
_RXKVOObserver(OC类)
,
Disposable(协议,便于移除观察者)
而且保存了一个闭包 进入
KVOObserver
内部,调用了父类的
init
:
_RXKVOObserver
是个OC类:保存了
target
,
keyPath
,
callback
,并把咱们的观察者甩锅给了当前的OC类
observeValueForKeyPath
中进行
callback
回调,并在
dispose
子类调用的时候移除观察者
至此,整个observeWeakly的底层原理就结束了,咱们能够看到底层最终仍是经过OC的KVO进行操做的ui
相关内存管理的问题:spa
self.person.rx.observerWEAKL.
-> KVOObservable - > person
会不会有循环引用?请看:unowned
弱引用,就打破了
KVOObservable
->
person
的强引用,也就不会产生循环引用了 2. unowned =(unsafaun_unretian)属于弱引用