我在使用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)
}
...
}
***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'一个实例释放了SwiftMaskText.SwiftMaskField类的0x7fbaafe45a20而关键值观察者仍在注册。当前观察信息:上下文:0x0,属性:0x6000002596e0>)'
仅在iOS 10中发生(尚未测试以前的版本),其他版本不会崩溃。
而且,我正在使用RxSwift 5.0。
您的书包必须在班级层次结构中处于您的视野之上。试试这个:
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)
}
...
}
这可能会解决它,如果不能解决,请通知我。
此外,如果您的视图模型确实需要在其中做一些错误,则它不需要处理包。