0

我有一个有 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
    }
}

视图代码2

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 时,更改消失了。

对不起我的英语不好。谢谢

4

1 回答 1

0

所有中继、主题和可观察对象都应始终使用 声明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方法里面订阅服务。

于 2020-11-28T17:41:57.120 回答