В этой статье я расскажу, как реализовать отложенную загрузку в UITableView. В нашей повседневной разработке это очень распространенный сценарий, когда нам нужно отображать изображения с URL-адреса в нашем UITableView. Для этого у нас есть несколько доступных библиотек (например, SDWebImage) в GitHub.

В этой статье я также объясню, как написать собственный класс, работающий как SDWebImage. Мы можем написать минимальный код для достижения той же функциональности, не слишком увеличивая размер приложения, потому что в сторонней библиотеке содержится много дополнительного кода, который нам даже не нужен.

Итак, давайте начнем шаг за шагом, в качестве первого шага мы можем создать расширение UIImageView следующим образом:

Приведенный выше код выполняет следующие задачи:

  1. Он принимает URL-адрес изображения и изображение-заполнитель, изначально он устанавливает изображение-заполнитель, если доступно, чтобы избежать пустого экрана. В случае, если изображение-заполнитель не было передано, мы просто устанавливаем цвет фона, чтобы избежать пустого белого пространства.
  2. На втором этапе мы просто загрузили изображение и установили текущий экземпляр UIImageView.

Проблема с указанным выше кодом:

Этот код будет работать, когда мы не используем повторно используемых представлений, но наш UITableViewCell можно использовать повторно, поэтому, если мы вызовем setImage () для каждой ячейки, он не будет правильно обрабатывать повторно используемые представления. . Таким образом, вы можете видеть множество колебаний изображения в своем пользовательском интерфейсе, потому что каждый раз, когда мы вызываем setImage, он просто выполняет вызов API для загрузки изображения. Таким образом, перед загрузкой и отображением UITableViewCell повторно используется для другого индекса, в этом случае после завершения загрузки старого изображения он установит ссылку на UITableViewCell, которая теперь повторно используется для нового индекса. Таким образом, это приведет к неправильному изображению в текущем indexPath.

Чтобы избежать этой проблемы, мы можем:

  1. Сохраните свойство на уровне класса, в котором хранится текущий вызываемый URL.
  2. Как только URL-адрес загружен, он будет соответствовать последнему URK, если последний URL-адрес и загруженный URL-адрес совпадают, чем мы просто отображаем изображение, иначе пропустите отображаемую часть.

При описанном выше подходе возникает проблема, заключающаяся в том, что расширение в Swift не позволяет сохранять свойства. Чтобы обойти эту проблему, мы можем либо использовать Objective-C связанные объекты, либо использовать следующий подход:

Если вы ищете изменения, мы внесли следующие изменения в код:

  1. Добавлена ​​статическая переменная (сохраненное свойство не разрешено) для хранения URL-адреса, соответствующего ссылке на класс.
  2. При отображении изображения просто проверяйте, совпадает ли последний URL-адрес с URL-адресом, для которого загружено изображение.

С помощью приведенной выше кодовой базы мы можем достичь полной функциональности для отложенной загрузки в UITableView. Я не реализовал кеширование в SDWebImage, это можно добавить в качестве улучшения.

Вы можете найти полный рабочий пример здесь: