【发布时间】:2018-02-01 10:49:46
【问题描述】:
我有一个定义了服务类的 ViewModel,这个服务类在这个 ViewModel 的初始化程序中被初始化。现在,当 ViewModel 中的值发生任何变化时,我需要更新我的视图(从服务中获取)。虽然我找到了一些使用变量的示例,但我无法通过类注入找到它。 视图控制器:
var presenter:Variable<CardViewModelProtocol>!
func setPresenter() {
//Following line has error
self.presenter = Variable<CardViewModelProtocol>(CardViewModelProtocol(service:CardService()))
self.presenter.value.attachView(view: self)
}
presenter 被初始化的那一行出错了。 错误:
'CardPresenterProtocol' 无法构造,因为它没有可访问的初始化程序
以下是 ViewModel 的初始化方式:
var cardService:CardServiceContract!
var materialNum = Variable<String>("")
init(service:CardServiceContract){
self.cardService = service
}
Edit1:简而言之,我想将以下行转换为支持 RxSwift 的变量并在 CardViewModel 中观察变量(类对象):
self.presenter = CardViewModel(service: CardService())
编辑2:
protocol CardViewModelProtocol : BaseViewModelProtocol {
func loadCardInfo(Serial serial:String)
var materialNum: Variable<String> {get set}
}
protocol BaseViewModelProtocol {
func attachView(view: BaseViewProtocol)
}
protocol BaseViewProtocol{
func setViewModel()
}
【问题讨论】:
-
变量将在 RxSwift 的未来版本中被删除。此外,使用一些构造函数初始化变量也是非常糟糕的做法。这打破了反应式编程的目的。为什么不传递 CardService 对象的实际引用?我没有看到像这样创建变量的任何意义。您至少应该传递值而不是构造它。
-
那么我应该用什么来代替变量?你能建议我这里的最佳实践吗?我刚刚开始使用 RxSwift
-
请提供更多关于您的 3 门课程的信息。 (显示 CarService 和可能的 CardViewCOntroller)
-
我已经在这里添加了我所有的相关代码,ViewModel 中还有一个方法可以从 CardService 获取一些数据,当这个 ViewModel 接收到这个数据(字符串)时,它会将它绑定到 ViewModel 中的 materialNum并将其发送到 View 显示
-
所以简而言之,View 会调用 ViewModel,然后会调用 Service,Service 然后会将数据返回给 ViewModel,ViewModel 再将其返回给 ViewController,如果你能指出这样的例子,它会很棒