MVVM: связывание View с ViewModel с замыканиями, неизвестными или слабыми? - PullRequest
0 голосов
/ 20 мая 2018

Я реализую простое приложение Master-Detail, в котором Master viewController управляет табличным представлением, в котором отображаются результаты вызова службы REST. Detail viewController управляет представлением, в котором я показываю дополнительную информацию об элементе, выбранном в Master .Распространенный сценарий.

Я пытаюсь применить шаблон MVVMMaster viewController я создаю и инициализирую его viewModel следующим образом:

lazy private var viewModel: ListViewModel = {
    return ListViewModel()
}()

override func viewDidLoad() {
    super.viewDidLoad()

    initViewModel()
}

private func initViewModel() {
    viewModel.onModelChange = { [weak self] () in
        DispatchQueue.main.async {
            self?.tableView.reloadData()
        }
    }

    viewModel.fetchData()
}

Мой вопрос: в закрытии, предоставленном для viewModel, следует self быть weak или unowned вместо этого?Я нашел пример реализации сценария, похожего на мой, который устанавливал его на weak, а другой - на unowned, так что я не совсем ясен.

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Unowned используется, когда вы на 100% уверены, что объект не будет освобожден.

weak вам нужно позаботиться о проблемах с количеством ссылок.

viewModel.onModelChange = { [weak self] () in
    guard let strongSelf = self else { return }
    strongSelf.tableView.reloadData()
}

Обычно я делаю это так.Затем вы удерживаете строгое указание self, чтобы избежать его выделения во время выполнения блока.

0 голосов
/ 20 мая 2018

[не владеющий собой] .Это говорит о том, что ваша модель не имеет строгой ссылки на ViewController

В документе Apple четко сказано, что:

«Как слабые ссылки, неподтвержденная ссылка не удерживает сильную связь с экземпляром, на который ссылается.В отличие от слабой ссылки, однако, предполагается, что у неизвестной ссылки всегда есть значение ».

В вашем случае всегда будет ViewController.Таким образом, преимущество неподтвержденной ссылки - это nonoptional.Развертывание не требуется каждый раз, когда оно используется

0 голосов
/ 20 мая 2018

Разница между unowned и weak заключается в том, что weak объявлен как Необязательный, а unowned - нет.Если вы знаете, что self не будет nil, используйте unowned, если не знаете: используйте weak

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...