Функция dequeueReusableCell не возвращает тот же экземпляр ячейки для заданного indexPath. Он возвращает ранее выделенный экземпляр ячейки, который в настоящее время не используется для повышения эффективности памяти, или новый, если он недоступен.
Когда запускается перезагрузка для ячейки, она не перезагружает тот же экземпляр, но переходит к той же функции cellForRowAt, которая возвращает повторно использованную или новую ячейку.
Вы можете кэшировать все ячейки самостоятельно и искать их, прежде чем запрашивать новые. Недостаточно памяти, но у вас всегда будет один и тот же экземпляр ячейки для IndexPath. Есть угловые случаи, когда собственный кеш имеет смысл. Со многими, многими записями в модели данных (скажем, список из 10000 песен) наилучшим способом является утилизация неиспользуемых (или не отображаемых) ячеек.
Как обновить ячейку тогда?
Лучшая практика для перезагрузки ячеек в UITableView зависит от источника события, которое требует перезагрузки. Эти два события связаны либо с пользовательским интерфейсом, либо с моделью данных.
UI / User:
Вы хотите перезагружать поведение из своей камеры? Затем позволяет ячейке запрашивать модель данных и обновлять ее содержимое. Ячейка может получить свой IndexPath как свойство вместе со слабой ссылкой на модель данных и запросить модель данных для самых новых данных. Или вы спрашиваете UITableViewDataSource, какой IndexPath принадлежит ячейке, чтобы выяснить, какие данные относятся к ней.
Модель данных:
Зачем вычислять обновления, где их нет? Более распространенным и похожим на Apple способом было бы обновление при изменении данных. В этом случае модель данных узнает, что она была изменена, и инициирует обновление. В основном используется reloadData (), но вы также можете обновить все видимые ячейки в отдельном потоке. Для каждой ячейки вы можете использовать UITableViewDataSource, чтобы сообщить вам, какой у него IndexPath, и решить, нужно ли обновлять эту ячейку. Или каждая ячейка знает свой IndexPath и сама принимает решение об обновлении, если эти данные предназначены для этой ячейки.
Вы можете заметить, есть много способов обновить ячейку. Я не знаю, какой подход лучше всего соответствует потребностям вашего приложения, но я думаю, что у вас есть вдохновение, как его решить.
Приветствия