MVVM: привязка представления к модели представления с помощью замыканий, как это приводит к циклу сохранения?

#swift #mvvm #closures #weak-references

Вопрос:

Я реализую простое приложение для составления списков товаров, в котором контроллер представления списка продуктов управляет представлением таблицы, в котором отображаются результаты вызова службы REST. Контроллер подробного представления управляет представлением, в котором я показываю дополнительную информацию об элементе, выбранном в ProductListVC. Я пытаюсь применить шаблон MVVM. Я использую замыкания для привязки между моделью представления и контроллером представления. В контроллере просмотра списка продуктов я создаю и инициализирую его модель представления следующим образом:

 class ProductListVC: UIViewController {
    var viewModel: ProductViewModel = ProductViewModel()
    var productTblView = UITableView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        initViewModel()
    }
    
    func initViewModel() {
        viewModel.reloadTableViewClosure = { [weak self] () in
            DispatchQueue.main.async {
                self?.productTblView.reloadData()
            }
        }
    
        viewModel.fetchData()
    }
}
 

Мой вопрос в том, в чем заключается необходимость использования [weak self] reloadTableViewClosure ? Как в этом случае происходит сильная ссылка? Было бы здорово, если бы кто-нибудь мог объяснить использование [weak self] или [unowned self] в этом случае. Мое замешательство в том, что, поскольку reloadTableViewClosure он принадлежит viewmodel, как self поддерживает сильную ссылку на закрытие?

Ответ №1:

Здесь [слабое я] используется для вашего productTblView, а не для ViewModel. «self» указывает здесь для ProductListVC. Предположим, объект контроллера был освобожден, а затем мы сильно обновим productTblView. Это приведет к сбою, поэтому мы используем [слабое я]/[никому не принадлежащее я].

Комментарии:

1. Спасибо вам за ответ. Было бы здорово, если бы вы могли объяснить еще некоторые детали. Как происходит сильный ссылочный цикл, если я не добавил [слабое я] или [никому не принадлежащее я]. Я новичок в программировании на iOS, пытаюсь четко понимать концепции. Заранее спасибо

2. Когда вы не будете использовать слабые и никому не принадлежащие, это будет сильной ссылкой. Чтобы избежать сильных ссылок, нам нужно использовать слабые и неизвестные. Всякий раз, когда мы используем объекты внутри блока отправки, непосредственно вызываемые с помощью self, это дает сильную ссылку.

Ответ №2:

Никому не принадлежащая ссылка не может быть равна нулю, а слабая-может. смотрите ссылку https://medium.com/@kiran.jasvanee/difference-between-unowned-self-and-weak-self-in-swift-310c14961953

https://www.avanderlee.com/swift/weak-self/