У меня есть гладкая проблема прокрутки в моем UITableView с UITableViewCell, которая содержит UIImageView. Аналогичные проблемы можно найти по всему StrackOverflow, но ни одно из предлагаемых решений не помогло мне полностью избавиться от отставания.
Мой случай довольно распространен:
- изображения хранятся в хранилище приложений (в моем примере в комплекте приложений)
- изображения могут иметь разный размер (500x500, 1000x1000, 1500x1500).
- Мне нужно отобразить эти изображения в UITableView, где размер UIImageView равен 120x120 (сетчатка)
Я выполнил несколько советов по оптимизации и смог оптимизировать прокрутку. К сожалению, он все еще не идеален. Это мой сценарий:
- сначала я переместил всю логику загрузки/обработки/изменения размера изображения в фоновый поток
- Повторное использование UITableViewCell включено
- Как только UITableViewCell находится в поле зрения, я очищаю старые значения (настройки до нуля) и запускаю фоновый поток для загрузки изображения.
- В этот момент мы находимся в фоновом потоке, и я добавляю задержку в 500 мс, чтобы часто не менять настройки нового изображения (в случае быстрого прокрутки) (см. ниже объяснение).
- если UIImage существует в кеше статического изображения (обычный словарь с экземплярами UIImage) - выберите его и перейдите к шагу 9.
- if not - загрузить новое изображение из пакета (imageWithName), используя URL-адрес приложения (в реальных сценариях изображения будут сохранены в хранилище приложений, а не в комплекте)
- После загрузки изображения изменение размера до 120x120 с использованием графического контекста
- сохранить измененное изображение в кеш статического изображения
- В этот момент мы имеем экземпляр для UIImage, и процесс находится в фоновом потоке. Отсюда мы возвращаемся к потоку пользовательского интерфейса с данным изображением
- если был очищен контекст данных (например, UITableViewCell исчез или повторно использовался для отображения другого изображения), мы пропускаем обработку текущего доступного изображения.
- если контекст данных одинаков - назначьте UIImage UIImageView с альфа-анимацией (UIView.Animate)
- как только UITableViewCell выходит из поля зрения - очистите контекст данных
Первоначально перед запуском нового фонового потока для получения изображения здесь (шаг 1) был проверен кеш UIImage без фонового потока. В этом случае, если у нас есть изображение в кеше, мы назначаем его мгновенно, и это приводит к большому отставанию во время быстрой прокрутки (мы часто добавляем изображения, пока мы получаем их мгновенно). Эти строки прокомментированы в моем примере, приведенном ниже.
Есть еще две проблемы:
- в какой-то момент во время прокрутки у меня все еще есть небольшое отставание (на момент, когда я назначаю новый UIImage UIImageView.
- (это более заметно), когда вы нажимаете на элемент и возвращаетесь от деталей, есть задержка перед завершением анимации назад.
Любые предложения о том, как справляться с этими двумя проблемами или как оптимизировать мой сценарий, оцениваются
Пожалуйста, учтите, что образец написан на Xamarin, но я не считаю, что Xamarin является причиной проблемы, если у меня такая же проблема для приложения, написанного в ObjectiveC.