【问题标题】:observing a class Variable for any change in viewModel in RxSwift观察 RxSwift 中 viewModel 的任何变化的类变量
【发布时间】: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,如果你能指出这样的例子,它会很棒

标签: ios swift rx-swift


【解决方案1】:

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

但请记住,RxSwift 4.0.0“弃用变量以支持 BehaviorRelay。”

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

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

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

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多