gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:16:04 25 4
gpt4 key购买 nike

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

 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?
}
}

显示的 session 正在绑定(bind)到 TableView :

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 运算符

最佳答案

ReactiveX 是一个功能范例。您不会“更改属性”,而是发出一个新属性。

通过让你的初始数组成为 Observables 的 Observables Observable<[Observable<Session>]> ,你可以接近做你想做的事。然后,您可以通过一个元素推送新 session ,而无需推送整个数组。不过,公平警告,这很快就会成为管理层的噩梦。


我认为更好的是有一个 Observable<[Int]>其中包含 session ID,用于填充 tableView 和单独的 Observable<[Int: Observable<Session>]>用于引用每个单元格中的值。

每个单元格都会从第一个可观察到的中获取一个 ID,并使用该 ID 来查找并订阅第二个可观察到的 session 。更新字典中的可观察对象不会导致整个 TableView 重新加载。

这仍然有点难以管理。也许可以制作字典Observable<[Int: Session]>相反,使您的 session 相等,并使用 distintUntilChanged()以避免重新加载单元格,除非在该特定 session 中确实发生了某些变化。

另外,请参阅我的回答:RxSwift : manage object updates in the app

关于swift - 使用 RxSwift 更改序列 Observable 内对象的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52352542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com