popViewController抛出“在键值观察器仍处于注册状态时取消分配”错误

问题描述 投票:1回答:1

我在使用observedBag分配可观察对象时遇到问题。 仅在iOS 10中发生。

我必须将TextField(SwiftMaskField)值与viewModel上的变量关联,所以我正在这样做:

class BaseViewController: UIViewController, Storyboarded {

    @IBOutlet weak var txtField: SwiftMaskField!

    var viewModel: BaseViewModel!

    override func viewDidLoad() {
        super.viewDidLoad()

        bindUI()
    }

    private func bindUI() {
        txtField.rx.text.orEmpty.bind(to: viewModel.myString).disposed(by: viewModel.bag)

        viewModel.showLoading.asObservable().skip(1).subscribe(onNext: { [unowned self] in
            self.showLoading()
        }).disposed(by: viewModel.bag)
    }

    ...
}

class BaseViewModel {
    var showLoading = BehaviorRelay<Void>(value: ())
    var myString = BehaviorRelay<String>(value:"")

    let bag = DisposeBag()

    func foo() {
        showLoading.accept(())
    }

    func foo2() {
        print(myString.value)
    }

    ...
}

当我执行popViewController时,我的应用程序崩溃并出现以下错误:

***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'一个实例释放了SwiftMaskText.SwiftMaskField类的0x7fbaafe45a20而关键值观察者仍在注册。当前观察信息:上下文:0x0,属性:0x6000002596e0>)'


仅在iOS 10中发生(尚未测试以前的版本),其他版本不会崩溃。

而且,我正在使用RxSwift 5.0。

ios swift rx-swift swift5
1个回答
1
投票

您的书包必须在班级层次结构中处于您的视野之上。试试这个:

class BaseViewController: UIViewController, Storyboarded {

    private let bag = DisposeBag()

    @IBOutlet weak var txtField: SwiftMaskField!

    var viewModel: BaseViewModel!

    override func viewDidLoad() {
        super.viewDidLoad()

        bindUI()
    }

    private func bindUI() {
        txtField.rx.text.orEmpty.bind(to: viewModel.myString).disposed(by: bag)

        viewModel.showLoading.asObservable().skip(1).subscribe(onNext: { [unowned self] in
            self.showLoading()
        }).disposed(by: bag)
    }

    ...
}

这可能会解决它,如果不能解决,请通知我。

此外,如果您的视图模型确实需要在其中做一些错误,则它不需要处理包。

© www.soinside.com 2019 - 2024. All rights reserved.