Если UITableViewController захватывает self в обработчике завершения executeBatchUpdates, может ли это вызвать цикл сохранения? - PullRequest
1 голос
/ 09 июля 2019

Скажем, у меня есть подкласс UITableViewController, в котором есть какая-то функция, например:

class MyTableVC: UITableViewController {
    func doSomething() { ... }
}

и я добавляю к нему функцию, которая вызывает performBatchUpdates с обработчиком завершения, который захватывает себя:

    func updateStuff() {
        tableView.performBatchUpdates(someUpdates, completion: { _ in 
            self.doSomething()
        }
    }

Существует ли опасность создания цикла сохранения? Если да, то гарантированно ли будет, что контроллер представления не равен нулю в обратном вызове? то есть, если есть возможность сохранения цикла, могу ли я использовать [unowned self] или необходимо использовать [weak self]

1 Ответ

2 голосов
/ 09 июля 2019

В вашем решении нет серьезных проблем.self будет сохраняться только до завершения пакетного обновления, что нормально.И я, вероятно, сделал бы то же самое, чтобы не усложнять код.

Регулярно немного лучше иметь weak или unowned, просто чтобы поддерживать подобный стиль кода в вашем проекте.

Если вы решите выбрать один из них, weak - единственный безопасный вариант здесь.Например, контроллер представления может быть удален с экрана и освобожден, пока таблица выполняет операцию обновления (вероятность действительно мала, но все еще существует), что приведет к сбою в результате.

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