почему контроллер deinit of view не вызывается с помощью RXSwift?

Я попробовал несколько вещей, но не смог найти решение. Я перемещаюсь по контроллеру в блоке onNext, но deinit не вызывает. Я также объявил себя слабым в замыканиях rx.

Ниже приведен полный код класса. Пожалуйста, исправьте, если я делаю что-то не так:

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)
    }
}

Любая помощь будет оценена по достоинству.


person Ale    schedule 13.11.2020    source источник
comment
Отвечает ли это на ваш вопрос? Deinit не вызывается в UIViewController, но Dealloc вызывается   -  person bseh    schedule 13.11.2020
comment
@bseh предоставленная вами ссылка совершенно неактуальна. Спасибо, что поделились мыслями.   -  person Ale    schedule 13.11.2020
comment
В коде, которым вы поделились, нет контроллера представления.   -  person Daniel T.    schedule 13.11.2020
comment
когда вы ожидаете, что это будет вызвано? Вы правильно отклоняете этот контроллер представления?   -  person Rukshan Marapana    schedule 13.11.2020
comment
@RukshanMarapana Я обновил код, пожалуйста, проверьте блок .subscribe, где я перехожу к следующему контроллеру, и результаты все те же.   -  person Ale    schedule 14.11.2020
comment
@Але я ответил.   -  person Rukshan Marapana    schedule 14.11.2020


Ответы (2)


Вы нажимаете следующий контроллер представления здесь.

self?.navigationController?.pushViewController

Когда вы делаете это, LoginVC никогда не освобождается, потому что он все еще находится в памяти и стеке навигационного контроллера. Так что нет причин для вызова deinit.

deinit будет вызван только в том случае, если вы отклоните LoginVC. И если ваш LoginVC является вашим корневым контроллером представления, он никогда не вызовет его deinit. Это не имеет ничего общего с RxSwift.

person Rukshan Marapana    schedule 14.11.2020
comment
Спасибо, @Rukshan Marapana, моя проблема была похожа на эту, и теперь она решена :) - person Ale; 16.11.2020

Вы сильно захватываете self в своей наблюдаемой цепочке. Затем поместите одноразовый предмет, содержащий подписку, в disposeBag, который является собственностью self.

Это означает, что у вас есть эталонный цикл. Ваш контроллер представления захватил сам себя.

person Daniel T.    schedule 13.11.2020
comment
Я объявляю себя [слабым я] в нашей наблюдаемой цепочке. Что еще мне нужно сделать, чтобы решить эту проблему? - person Ale; 13.11.2020
comment
Вы не объявляете [weak self] в каждом месте кода выше. Если вы изменили код, но проблема не устранена, отредактируйте код в вопросе. - person Daniel T.; 13.11.2020
comment
@Ale, точнее, у вашего onCompleted нет [слабого я] в коде, который вы разместили выше. - person Simon McLoughlin; 13.11.2020
comment
@ДэниелТ. Я попробовал изменение, о котором вы просили, а также обновил приведенный выше патч кода, но результаты все те же. Это не работает. - person Ale; 13.11.2020
comment
Разместите, пожалуйста, весь класс. Вероятно, в коде, который вы не опубликовали, есть цикл сохранения. - person Daniel T.; 13.11.2020
comment
@ДэниелТ. Я добавил полный класс, пожалуйста, просмотрите приведенный выше код. - person Ale; 13.11.2020
comment
Деинит LoginVC был вызван с использованием предоставленного вами кода. Проблема не в коде, который вы представили до сих пор. - person Daniel T.; 14.11.2020
comment
@ДэниелТ. звучит странно. Я пытался до сих пор, но не смог добиться этого. - person Ale; 14.11.2020
comment
@Ale Опубликуйте минимальный компилируемый пример кода, который вызывает проблему, с которой вы столкнулись. Вы еще не опубликовали код, который содержит проблему. - person Daniel T.; 15.11.2020