使用裸 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、RxCocoa 和 UITableview

正确使用 RxSwift 和 TableView

使用 RxSwift 和 Parse-Server 进行轮询

如何使用 RxSwift 和 Alamofire 使用分页?

在啥情况下我可以使用 zip 和 combineLatest? RxSwift