通过代码显示新的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)
        }
}

最佳答案

我的猜测是您是从URLSession发出网络请求的结果中调用goToVerifyPage()的。 URLSession在后台线程上发出其值,因此当您准备切换到主线程时,应该有一个.observeOn(MainThread.instance)

关于ios - 只能从MainThread调用驱动器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54616586/

10-13 03:59