只能从MainThread调用驱动器

时间:2019-02-10 12:51:49

标签: ios rx-swift

在通过代码呈现新的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)
        }
}

1 个答案:

答案 0 :(得分:2)

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