簡體   English   中英

RxSwift變量組成,無需訂閱/綁定/驅動

[英]RxSwift Variable composition without subscribe/bind/drive

我需要在viewModel中有一些內部狀態,但也要嘗試遵循“無訂閱/綁定/驅動器/ ...”的理想方法,並且只能在Observables之間進行Observables

如何指定Variable觀測值?

例:

private var userProfilesToFetch = Variable<[String]>([])
private var users: Variable<[User]> {

    return //something that observes fetchUserProfiles() and when it emits, appends to its .value
}

private func fetchUserProfiles() -> Observable<User?> {

    let reference = databaseRef.child("users")

    return userProfilesToFetch.asObservable()
        .filter({ $0 != [] })
        .map({ $0.last! })
        .flatMap({ (userId) -> Observable<User?> in

            return self.service.observeAllChildren(of: reference.child(userId), by: .value)
                .map({ (snapshot) -> User? in

                        guard let values = snapshot.value as? [String: AnyObject] else { return nil }

                        var user = User(dictionary: values)

                        user.id = snapshot.key

                        return user
                })
        })
} 

“理想方法”是避免使用主題/變量。 取而代之的是,偏愛序列發射器(返回可觀察到的函數),序列接收器(接受可觀察到的函數作為參數)和序列轉換器(兩者都執行的函數)。

序列發射器和接收器必然會產生副作用,並且序列接收器內部 ,必須有一個訂閱/綁定才能拆開值並使用它。

發射器和接收器之間應該有直接明顯的聯系。 主題/變量傾向於破壞該鏈接。

在這種理想的方法中,您的“視圖模型”不是包含一堆變量的類/結構。 您的視圖模型是一個函數,將可觀察值作為參數並返回可觀察值以供視圖控制器綁定。 例如:

class MyViewController: UIViewController {
    @IBOutlet weak var name: UITextView!
    @IBOutlet weak var label: UILabel!

    override
    func viewDidLoad() {
        super.viewDidLoad()
        let viewModel = myViewModel(name: name.rx.text.orEmpty)
        viewModel.label.bind(to: label.rx.text).disposed(by: bag)
    }
    let bag = DisposeBag()
}

struct MyViewModel { 
    let label: Observable<String>
}

// this function could be turned into an `init` method on the MyViewModel struct if you would prefer.
fun myViewModel(name: Observable<String>) -> MyViewModel {
    let label = name.map { "Hello \($0)!" }
    return MyViewModel(label: label)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM