使用RxSwift在Observable序列内更改对象的值

时间:2018-09-16 08:55:38

标签: swift rx-swift

我有一个可观察的序列,代表我显示的会话,如下所示:

 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

2 个答案:

答案 0 :(得分:2)

你不能。

这是使用Rx的人们非常奇怪的误解,因此重要的是要强调:

SubjectObservable通常没有值,因为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