RxSwft 非常適合 iOS MVVM。
到處放置視圖模型,違反了迪米特法則(最少知識原則)。
其他缺點是什么?
它會導致記憶體泄漏嗎?
下面是一個例子:
ViewController 有一個 viewModel
ViewModel 有一些事件信號,比如下面的回傳事件
class ViewModel{
let backSubject = PublishSubject<String>()
}
ViewController 具有contentViewandviewModel和contentViewinit withviewModel
lazy var contentView: ContentView = {
let view = ContentView(viewModel)
view.backgroundColor = .clear
return view
}()
并且ViewModel的各個subject都在viewController中訂閱來處理其他部分的view
viewController 是一個調度中心。
ViewModel是活動中轉站。ViewModel無處不在,在Controller中,在View中,收集不同的事件觸發器。
代碼很意大利面
在ContentView,用戶點擊 rx 事件,系結到 viewController 中的 viewModel
tapAction.bind(to: viewModel.backSubject).disposed(by: rx.disposeBag)
用戶事件很容易連接起來。
但實際上存在記憶體泄漏。
那么其他的缺點是什么呢?
uj5u.com熱心網友回復:
ViewModel 沒有違反 Demeter 定律,但它確實違反了單一職責原則。您解決這個問題的方法是使用多個視圖模型,每個功能一個,而不是整個螢屏的單個視圖模型。這將使視圖模型更具可重用性和可組合性。
如果您將視圖模型設定為單個函式,該函式將多個 Observable 作為輸入并回傳單個 Observable,您還將消除任何記憶體泄漏的可能性。
例如:
func textFieldsFilled(fields: [Observable<String?>]) -> Observable<Bool> {
Observable.combineLatest(fields)
.map { $0.allSatisfy { !($0 ?? "").isEmpty } }
}
您可以根據是否已填寫所有文本欄位將上述內容附加到要啟用按鈕的任何場景。
您滿足 SRP 并且由于物件分配是自動處理的,因此不必擔心上述內容會泄漏記憶體。
uj5u.com熱心網友回復:
你是對的,有一些缺點,如果你只想要一個資料系結,我建議Combine改用,因為不需要 3rd 方庫,你已經有了它。RxSwift當您將它用作語言的一部分時,它是一個非常強大的工具,而不僅僅是用于資料系結。
從我的作業經驗中得出的一些建議RxSwift:
- 嘗試將 VM 作為結構,而不是類。
- 避免在您的 VM 中使用 DisposeBag,而是讓 VC 訂閱所有內容(更好地避免記憶體泄漏)。
- 為子視圖、單元、子 VC 和不共享的創建自己的 VM。
由于您的 VC 是一個調度中心,我會為您的內容視圖制作一個單獨的 VM,ContentView VM并ViewController VM在您的控制器之間和通過您的控制器進行通信。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/396907.html
上一篇:在flutter中的singlechildscrollview之后,ModalBottomSheet中的底部按鈕不可見
