在通过代码呈现新的UIViewController之后,使用.Drive的每个地方(在viewModel或viewController中),我都会收到此错误:
drive* family of methods can be only called from MainThread
这就是我展示新的ViewController的方式:
func goToVerifyPage() {
let verifyVC = VerifyViewController()
verifyVC.modalTransitionStyle = .flipHorizontal
self.present(verifyVC, animated: true, completion: nil)
}
并在VerifyViewController内部:
override func viewDidLoad() {
super.viewDidLoad()
confirmVerifyCodeBTN.rx.tap
.asDriver()
.debounce(1)
.filter({
self.viewModel.signupEnabled
})
.drive(onNext:{ [weak self] _ in
guard let verifyCode = self?.verificationCodeTF.text else { return }
self?.verifyActivateCode(verifyCode)
}).disposed(by: disposeBag)
}
执行.filter行后显示的错误。
在previos viewController(名为loginViewController)中,我使用相同的代码,但未收到任何错误,verifyViewController和loginViewController之间唯一的不同是,使用情节提要来呈现该ViewController(loginViewController)。
更新: 当我使用此代码来展示verifyViewController时,一切正常:
func goToVerifyPage() {
DispatchQueue.main.async {
let verifyVC = VerifyViewController()
verifyVC.modalTransitionStyle = .flipHorizontal
self.present(verifyVC, animated: true, completion: nil)
}
}
答案 0 :(得分:2)
我的猜测是您是根据URLSession的网络请求的结果调用goToVerifyPage()
的。 URLSession在后台线程上发出其值,因此当您准备切换到主线程时,应该有一个.observeOn(MainThread.instance)
。