#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