ios - 为什么视图控制器的 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)
}
}
任何帮助,将不胜感激。
解决方案
您正在这里推送下一个视图控制器。
self?.navigationController?.pushViewController
当你这样做时,LoginVC
永远不会被释放,因为它仍然在内存和导航控制器的堆栈中。所以没有理由deinit
被召唤。
deinit
只有在您解雇时才会被调用LoginVC
。如果你LoginVC
是你的根视图控制器,它永远不会称之为deinit
. 这与 RxSwift 无关。
推荐阅读
- python - 将 python 字典转换为 pandas 数据框,但这段代码不允许我这样做。(NBA 数据转义)
- laravel - 在刀片模板中保留带输出的缩进
- javascript - 为什么图像弹出然后又消失了
- mysql - MySQL有没有办法在更新之前检查字段中是否存在字符串?
- ruby - 使用 case 语句 ruby 简化重复行
- ios - Swift 包管理器:从发布中排除
- java - 使用 SSH java 连接到数据库
- java - 如何从 javafx 中的 TreeView 中删除特定的 TreeItem?
- javascript - 使用 API 后,我不会从 API 获取数据
- javascript - 用纯css填充较低的输入范围?