首页 > 解决方案 > 为什么视图控制器的 deinit 不使用 RXSwift 调用?

问题描述

我尝试了几件事,但找不到解决方案。我在 onNext 块中导航控制器,但 deinit 没有调用。我还在 rx 闭包中声明了 self 是弱的。

下面是完整的类代码。 如果我做错了什么,请更正:

class LoginVC: UIViewController {

    //MARK:- Variables & Consts
    private let tag = "LoginVC"
    private let loginViewModel = LoginViewModel()
    private let disposeBag = DisposeBag()
    
    //MARK:- IBOutlets
    @IBOutlet weak var tfUsername: MFTextField!
    @IBOutlet weak var tfPassword: MFTextField!
    @IBOutlet weak var btnLogin: UIButton!
    
    //MARK:- View Controller Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupBindings()
    }
    
    ///deinit
    deinit {
        print(" deinit")
    }
    
    //MARK:- Custom Methods
    
    private func setupBindings() {
        loginViewModel
            .loginResponse
            .observeOn(MainScheduler.instance)
            .subscribe(onNext: { [weak self] loginResponse in
             let vc = UIStoryboard(name: Constants.MAIN, bundle: nil).instantiateViewController(withIdentifier: Constants.HOME_VC)
                self?.navigationController?.pushViewController(vc, animated: true)
            }, onError: { [weak self] error in
                self?.removeLoader()
            }, onCompleted: {  [weak self]  in
                self?.removeLoader()
            }, onDisposed: { [weak self] in
                print("\(self?.tag ?? "") onDisposed")
            })
        .disposed(by: disposeBag)
        
        btnLogin.rx.tap.bind{ [weak self] in
            self?.loginViewModel.login(username: self?.tfUsername.text ?? "", password: self?.tfPassword.text ?? "")
        }.disposed(by: disposeBag)
    }
}

任何帮助,将不胜感激。

标签: iosswiftreactive-programmingrx-swiftrx-cocoa

解决方案


您正在这里推送下一个视图控制器。

self?.navigationController?.pushViewController

当你这样做时,LoginVC永远不会被释放,因为它仍然在内存和导航控制器的堆栈中。所以没有理由deinit被召唤。

deinit只有在您解雇时才会被调用LoginVC。如果你LoginVC是你的根视图控制器,它永远不会称之为deinit. 这与 RxSwift 无关。


推荐阅读