【问题标题】:Rx BehaviorRelay doesnt keep the data when return from a view从视图返回时,Rx BehaviorRelay 不保留数据
【发布时间】:2020-11-28 16:19:51
【问题描述】:

我有一个有 3 个视图和一个服务逻辑层的应用程序。服务一直在向所有这些视图发送消息。我用来控制所有这些数据的方法是使用 RxBehaviorRelay。

到目前为止,一切都很好,我将变量与服务层匹配,并且我在 ViewController 1、2 和 3 中接收数据。

当我在view2上然后转到view3并返回view2时,问题就来了。在此返回时,我丢失了所有更改,而 BehaviorRelay 对象就像开始一样。

我在view1中的代码是这样的

class View1: UIViewController {
    var service: ServiceModel? = ServiceModel()
    
    var observableView1 = BehaviorRelay(value: [Object]())
    var observableView2 = BehaviorRelay(value: [Object]())
    
    override func viewDidLoad() {
        service!.observableView1 = self.observableView1
        service!.observableView2 = self.observableView2
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destination = segue.destination as! View2
        destination.observableView2 = self.observableView2
    }
}

view2代码

class View2: UIViewController {
    let disposeBag = DisposeBag()
    
    var observableView2 = BehaviorRelay(value: [Object]())
    
    override func viewDidLoad() {
        fillTable()
    }
    
    func fillTable() {
        observableView2.asObservable().bind(to: tvData.rx.items) { (tableview, row, data) in
            //code to fill the table
        }.disposed(by: disposeBag)
    }
}

在服务层上,我只接收更改并放入 BehaviorRelay 对象。

observableView2.accept(changes)
observableView1.accept(changes)

正如我所说,我获得了 view2 中的所有更改,但是当我移动到 view3 并返回 view2 时,这些更改消失了。

对不起我的英语。 谢谢

【问题讨论】:

    标签: swift rx-swift behaviorrelay


    【解决方案1】:

    所有的relay、subjects和observables都应该使用let来声明,而不是var。完成此修复后,您会注意到丢失更改的原因。

    根据您的描述,我预计会更像:

    final class Service { 
        private let _observableView1 = BehaviorRelay(value: [Object]())
        private let _observableView2 = BehaviorRelay(value: [Object]())
        let observableView1: Observable<[Object]>
        let obserrvableView2: Observable<[Object]>
        init() { 
            observableView1 = _observableView1.asObservable()
            observableView2 = _observableView2.asObservable()
        }
    }
    

    然后将Service传递给View 2,或者在prepare方法里面订阅该服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 2019-07-04
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多