我有一个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()
}
答案 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