使用裸RxSwift和BehaviourSubject同步模型

时间:2017-12-07 14:49:39

标签: swift synchronization reactive-programming rx-swift

我是swift和rxSwfit世界的新手,我正在寻求建议或批评这个当前的解决方案,例如,同步博客文章,类别,作者或我们需要的任何东西。

采用这种经典情况:一个可观察的,它为每个订阅者提供模型中存在的最新更新数据,并且从那一刻开始,对于模型的每次同步,它都会发出新的整个数据包,因此订阅者获得并对更新的数据进行操作。

我建立了一个可观察者,他的下一个值是他当前值(ram中存在的数据)与其余值的组合。

举个例子,帖子:

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 

然后我创建了更新&#34; articoli2&#34;

的订阅
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 个答案:

答案 0 :(得分:0)

Observable.zip()是用于分页的不正确的运算符。为此原因设计了scan operator