观察一个类变量,用于RxSwift中viewModel的任何变化

时间:2018-02-01 10:49:47

标签: ios swift rx-swift

我有一个ViewModel,其中定义了一个服务类,这个服务类在这个ViewModel的初始化程序中初始化。现在,当ViewModel中的值发生任何变化(从服务中获取)时,我需要更新我的View。虽然我已经找到了一些使用Variable的例子但我找不到Class注入。 的ViewController:

    var presenter:Variable<CardViewModelProtocol>!
        func setPresenter() {
//Following line has error
            self.presenter = Variable<CardViewModelProtocol>(CardViewModelProtocol(service:CardService()))
            self.presenter.value.attachView(view: self)
        }

初始化presenter的行给出了错误。 错误:

  

&#39; CardPresenterProtocol&#39;无法构造,因为它没有可访问的初始值设定项

以下是ViewModel的初始化方式:

var cardService:CardServiceContract!
var materialNum = Variable<String>("")

init(service:CardServiceContract){
    self.cardService = service
}

Edit1:简而言之,我想将以下行转换为支持变量的RxSwift并观察CardViewModel中的变量(类对象):

self.presenter = CardViewModel(service: CardService())

EDIT2:

    protocol CardViewModelProtocol : BaseViewModelProtocol {

    func loadCardInfo(Serial serial:String)

    var materialNum: Variable<String> {get set}
}
protocol BaseViewModelProtocol {
    func attachView(view: BaseViewProtocol)
}
protocol BaseViewProtocol{
    func setViewModel()
}

1 个答案:

答案 0 :(得分:0)

这是一个使用示例 - https://github.com/RxSwiftCommunity/RxSegue/blob/master/Example/RxSegue/ProfileViewController.swift

但请记住,RxSwift 4.0.0&#34;弃用变量以支持BehaviorRelay。&#34;

如果您没有义务关注MVVM,可以尝试使用单向数据流方法 - https://github.com/maxvol/RaspSwift

如果要连续订阅服务器更新,您可以使用 .switchLatest()运算符 -

let stream = PublishSubject<Observable<Response>>()
stream.switchLatest().subscribe(consumer)
stream.onNext(serverRequestReturningResponseObservable) // repeat whenever needed