我有一个可观察的序列,代表我显示的会话,如下所示:
private let displayedSessions =
PublishSubject<[ProgramDaySessionsModels.ViewModels.Session]>()
这是我的ViewModel:
struct ViewModels {
struct Session{
let id : Int?
let title : String?
let location : String?
var isAddedToCalendar : Bool?
var isAddedToFavorite : Bool?
let time : String?
}
}
显示的会话已绑定到表格视图:
func setupCellBinding(){
displayedSessions
.asObservable()
.bind(to:
tableView
.rx
.items(cellIdentifier:
R.reuseIdentifier.programDaySessionCell.identifier,
cellType: ProgramDaySessionCell.self)
){
( row, element, cell ) in
cell.setup(withViewModel: element)
}
.disposed(by: disposeBag)
}
现在,在单元格中调用设置方法之后,我想在单元格中订阅图像点按,无论订阅逻辑是什么……。
此后,我想更新显示的viewModel,例如,我想在订阅逻辑结束时将属性isAddedToCalendar
更改为false / true ...
我的问题是,如何在不调用的情况下更新或更改存储在Subject
中的值 onNext
答案 0 :(得分:2)
你不能。
这是使用Rx的人们非常奇怪的误解,因此重要的是要强调:
Subject
和Observable
通常没有值,因为Observable是值流并且没有” t代表一个值。
根据ReactiveX标准,使用onNext
(或.on(.next...)
)为主题添加值。
您认为该值应该与onNext
事件分开的事实在我看来,您需要回到基础知识,并阅读一些Rx / ReactiveX / RxSwift文档以了解其中的基本概念。可观察的流。
祝你好运!
答案 1 :(得分:1)
ReactiveX是一种功能范例。您无需“更改属性”,而是发出新属性。
通过将初始数组设置为Observable of Observables Observable<[Observable<Session>]>
,您可以接近完成所需的操作。然后,您可以通过一个元素推送新会话,而无需推送整个数组。尽管有合理的警告,但这很快就会成为管理方面的噩梦。
更好的是,我认为应该有一个Observable<[Int]>
,其中包含会话ID,用于填充tableView和一个单独的Observable<[Int: Observable<Session>]>
,用于引用每个单元格中的值。
每个单元格将从第一个可观察对象获取ID,然后在第二个中使用该ID查找并订阅其Session。在字典中更新可观察对象不会导致重新加载整个表格视图。
仍然很难管理。也许改为使字典Observable<[Int: Session]>
,使Sessions Equatable,然后使用distintUntilChanged()
避免重新加载单元格,除非在该特定会话中实际上没有任何改变。
另外,请在这里查看我的答案:RxSwift : manage object updates in the app