// 序列
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)屬於弱引用