Анимация прогресса на сотнях кнопок UIB без блокировки основного потока - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть UITableView с максимум несколькими сотнями ячеек (не все видны сразу).Каждая ячейка содержит UIButton с указанием хода загрузки.URLSession выполняет загрузку в фоновых задачах.

В настоящее время делегатом сеанса является UIViewController, который управляет ячейками.В результате сеанс вызывает делегата .URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend: для периодического информирования делегата о ходе отправки контента на сервер.

В методе делегата я нахожу UIButton, связанный с этой задачей, и анимируюновый прогресс (я могу найти кнопку, потому что я делаю button.identifier = task.identifier).

Этот подход заставляет меня находить кнопку каждый раз, когда вызывается метод делегата.Это кажется косвенным, и мне интересно, есть ли лучший способ сделать это - могут быть сотни кнопок, так обеспокоенных временем выполнения.

Я думал сделать кнопку делегатом сеанса, но это противоречитMVC и ссылка на кнопку могут исчезнуть или измениться в табличном представлении, что приведет к неопределенному поведению (хотя имеет смысл обновлять только те кнопки, которые действительно находятся в памяти).

1 Ответ

1 голос
/ 20 апреля 2019

может быть 100 секунд кнопок

Нет, не может.Ячейки, которые не отображаются на экране, вообще не существуют (поскольку ячейки используются повторно в табличном представлении).Так что вам нужно беспокоиться только о клетках, которые действительно видны в любой момент.Смотрите UITableView visibleCells и indexPathsForVisibleRows.Таким образом, даже если ваш подход не очень эффективен, он также не очень неэффективен.

Тем не менее, правильный способ сделать это - использовать объект progress, предоставленный вашей задачей загрузки.Когда загрузка начнется, скажите ячейке или кнопке, или что-либо еще, чтобы начать наблюдение progress объекта fractionCompleted с использованием наблюдения значения ключа.Теперь ячейка, кнопка или все, что находится в непосредственном контакте с этой одной задачей, может обновляться каждый раз, когда слышит об изменении fractionCompleted.Когда ячейка перестанет отображаться, прекратите наблюдение.Есть еще кое-что (например, справиться с повторно используемыми ячейками, которые прокручиваются на экране, когда соответствующая задача уже выполняется), но это базовая архитектура, которую вы хотите.

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