使用裸 RxSwift 和 BehaviorSubject 同步模型
Posted
技术标签:
【中文标题】使用裸 RxSwift 和 BehaviorSubject 同步模型【英文标题】:Syncing Model with bare RxSwift and BehaviourSubject 【发布时间】:2017-12-07 14:49:39 【问题描述】:我是 swift 和 rxSwfit 世界的新手,我正在就当前的解决方案征求建议或批评,例如同步博客文章、类别、作者或我们需要的任何内容。
以这种经典情况为例:一个 observable 向每个订阅者提供模型中存在的最后更新数据,并且从那一刻起,对于模型的每次同步,它都会发出新的整个数据包,因此订阅者得到并对更新后的数据进行操作。
我构建了一个 observable,他的下一个值是他当前值(内存中存在的数据)与从其余值中获取的值的组合。
以帖子为例:
let articoli2 = BehaviorSubject<[Articolo]>(value: [Articolo]()) // ram data, initially empty
var articoli_rest = PublishSubject<[Articolo]>() // net data
var idx_articoli2 = [Int:Articolo]() // used for filtering duplicates
然后我创建更新“articoli2”的订阅
Observable.zip(articoli2, articoli_rest) (ram_articoli, rest_articoli) -> [Articolo] in
var new_articoli = ram_articoli
//Code that merges the data currently present (ram_articoli)
//with the data grabbed from the net (rest_articoli)
...
return new_articoli
.subscribe(onNext: (articoli) in
self.articoli2.onNext(articoli)
).disposed(by: disposeBag)
最后,当我想更新模型时,我使用:
func sync_articoli()
get_rest_array(Articolo.self,"https://rest_route").retry(4)
.subscribe(onNext: (articoli) in
self.articoli_rest.onNext(articoli)
此函数订阅由 get_rest_array 返回的单个 observable 当来自网络的数据准备好时,它会在 articoli_rest 上发出一个项目 这反过来又更新了我的 articoli2。 整个事情都有效,但我不确定它是否真的可用,我对我的解决方案没有信心。有什么话吗? (责备你想要的)
【问题讨论】:
【参考方案1】:Observable.zip()
是用于分页的错误运算符。有一个scan operator 专为此目的而设计。
【讨论】:
谢谢,我会重写实现。对整体解决方案有何看法? @Fruff 我相信开发面向对象的解决方案总是更好,即使只是Paginable
。看看这个博客yegor256.com/best.html,我打赌你会发现它很吸引人。以上是关于使用裸 RxSwift 和 BehaviorSubject 同步模型的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxSwift 和 URLSession 处理 401 状态
使用 RxSwift 和 Parse-Server 进行轮询