Kingfisher для Swift: полное руководство с примерами

Онлайн-тренажер Python для начинающих

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

Начать курс

Введение в Kingfisher: что это и зачем нужно

Kingfisher — это мощная и популярная библиотека для Swift, предназначенная для загрузки и кэширования изображений из сети. Она предоставляет разработчикам простой, но гибкий API для работы с изображениями в iOS, macOS, tvOS и watchOS приложениях. Библиотека написана на чистом Swift и активно поддерживается сообществом.

Зачем нужен Kingfisher? В современных мобильных приложениях работа с изображениями — одна из ключевых задач. Пользователи ожидают быстрой загрузки контента, плавного скроллинга и минимального потребления трафика. Kingfisher решает эти проблемы, автоматически управляя загрузкой, кэшированием (в памяти и на диске) и отображением изображений. Вместо того чтобы писать сложный код для управления сетевыми запросами, обработки ошибок и кэширования, вы можете просто вызвать один метод setImage(with:).

Ключевые возможности:

  • Асинхронная загрузка: изображения загружаются в фоновом потоке, не блокируя UI.
  • Многоуровневое кэширование: сначала проверяется кэш в памяти (быстрый доступ), затем дисковый кэш (персистентное хранение).
  • Обработка ошибок: встроенные механизмы для обработки сетевых ошибок, неверных URL и поврежденных данных.
  • Поддержка GIF и SVG: возможность отображения анимированных изображений и векторной графики.
  • Трансформации изображений: встроенные методы для изменения размера, обрезки, наложения фильтров и округления углов.
  • Интеграция с UIKit и AppKit: расширения для UIImageView, NSImageView, UIButton и других элементов.
  • Отмена загрузки: автоматическая отмена запросов при переиспользовании ячеек в UITableView/UICollectionView.

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

Установка Kingfisher

Kingfisher можно установить несколькими способами. Рекомендуемый метод — через Swift Package Manager (SPM), так как это нативный инструмент для управления зависимостями в Swift.

1. Swift Package Manager (SPM) — Рекомендуемый способ

Откройте ваш проект в Xcode, перейдите в File → Add Packages... и вставьте URL репозитория:

https://github.com/onevcat/Kingfisher.git

Выберите версию (рекомендуется "Up to Next Major Version" с последней стабильной версией) и добавьте пакет в ваш таргет.

2. CocoaPods

Добавьте в ваш Podfile:

pod 'Kingfisher', '~> 7.0'

Затем выполните в терминале:

pod install

3. Carthage

Добавьте в ваш Cartfile:

github "onevcat/Kingfisher" ~> 7.0

Затем выполните:

carthage update

4. Ручная установка

Скачайте последний релиз с GitHub и добавьте файлы из папки Sources/Kingfisher в ваш проект.

После установки не забудьте импортировать библиотеку в файлах, где вы планируете её использовать:

import Kingfisher

Быстрый старт: первый пример

Давайте начнем с самого простого примера — загрузка изображения по URL и отображение его в UIImageView. Это базовая операция, с которой начинается работа с Kingfisher.

import UIKit
import Kingfisher

class ViewController: UIViewController {
    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = URL(string: "https://example.com/image.jpg")!
        imageView.kf.setImage(with: url)
    }
}

В этом примере мы вызываем метод setImage(with:) на экземпляре UIImageView. Kingfisher автоматически:

  • Проверяет, есть ли изображение в кэше (сначала в памяти, потом на диске).
  • Если изображение найдено в кэше — мгновенно отображает его.
  • Если изображения нет в кэше — загружает его асинхронно по URL.
  • После загрузки сохраняет изображение в кэш и отображает его.
  • Если загрузка не удалась — показывает placeholder (если он был задан) или ничего не показывает.

Этот простой пример демонстрирует основную философию Kingfisher: минимум кода для максимум функциональности.

Основные методы и функции Kingfisher

Ниже представлены ключевые методы библиотеки с подробным описанием, параметрами и примерами кода.

1. setImage(with:placeholder:options:completionHandler:)

Что делает: Основной метод для загрузки и отображения изображения. Он доступен как расширение для UIImageView, NSImageView, UIButton и других элементов. Это самый часто используемый метод в Kingfisher.

Параметры:

  • with (URL?) — URL изображения для загрузки.
  • placeholder (Placeholder?) — изображение, которое отображается во время загрузки. Может быть UIImage, GIF или nil.
  • options (KingfisherOptionsInfo?) — словарь опций для настройки загрузки (таймаут, кэширование, трансформации и т.д.).
  • completionHandler ((Result<RetrieveImageResult, KingfisherError>) -> Void)? — замыкание, вызываемое после завершения загрузки (успех или ошибка).

Пример кода:

let url = URL(string: "https://example.com/photo.png")!
let placeholder = UIImage(named: "placeholder")

imageView.kf.setImage(
    with: url,
    placeholder: placeholder,
    options: [
        .transition(.fade(0.3)), // плавное появление
        .cacheMemoryOnly         // кэшировать только в памяти
    ],
    completionHandler: { result in
        switch result {
        case .success(let value):
            print("Изображение загружено: \(value.source.url?.absoluteString ?? "")")
        case .failure(let error):
            print("Ошибка загрузки: \(error.localizedDescription)")
        }
    }
)

2. setImage(with:placeholder:options:progressBlock:completionHandler:)

Что делает: Расширенная версия метода setImage с возможностью отслеживания прогресса загрузки. Полезно для отображения индикатора загрузки.

Параметры: Те же, что и в предыдущем методе, плюс:

  • progressBlock ((Int64, Int64) -> Void)? — замыкание, которое вызывается во время загрузки. Первый параметр — количество загруженных байт, второй — общий размер.

Пример кода:

imageView.kf.setImage(
    with: url,
    placeholder: placeholder,
    progressBlock: { receivedSize, totalSize in
        let progress = Float(receivedSize) / Float(totalSize)
        print("Прогресс: \(progress * 100)%")
    },
    completionHandler: { result in
        // обработка результата
    }
)

3. cancelDownloadTask()

Что делает: Отменяет текущую задачу загрузки изображения для данного элемента (UIImageView, UIButton и т.д.). Очень полезно при переиспользовании ячеек в таблицах и коллекциях, чтобы избежать загрузки старых изображений.

Параметры: Нет.

Пример кода:

// В методе prepareForReuse ячейки UITableView
override func prepareForReuse() {
    super.prepareForReuse()
    imageView.kf.cancelDownloadTask()
    imageView.image = nil // сброс изображения
}

4. downloadTask(with:options:completionHandler:)

Что делает: Загружает изображение по URL без привязки к конкретному UI-элементу. Возвращает объект DownloadTask, который можно использовать для отмены загрузки или отслеживания прогресса. Полезно для предзагрузки изображений или работы с ними в фоновом режиме.

Параметры:

  • with (URL) — URL изображения.
  • options (KingfisherOptionsInfo?) — опции загрузки.
  • completionHandler ((Result<RetrieveImageResult, KingfisherError>) -> Void)? — замыкание с результатом.

Пример кода:

let task = KingfisherManager.shared.downloadTask(
    with: url,
    options: [.cacheMemoryOnly]
) { result in
    switch result {
    case .success(let value):
        let image = value.image
        // Используем изображение
    case .failure(let error):
        print("Ошибка: \(error)")
    }
}

// При необходимости можно отменить
task?.cancel()

5. cache(_:forKey:toDisk:serializer:)

Что делает: Сохраняет изображение в кэш Kingfisher вручную. Это может быть полезно, если вы загрузили изображение другим способом (например, через URLSession) и хотите добавить его в кэш Kingfisher для последующего использования.

Параметры:

  • _ (Image) — изображение для кэширования.
  • forKey (String) — ключ, по которому изображение будет сохранено в кэше. Обычно это URL строкой.
  • toDisk (Bool) — сохранять ли на диск (true) или только в память (false).
  • serializer (CacheSerializer?) — сериализатор для преобразования изображения в данные.

Пример кода:

let image = UIImage(named: "localImage")!
let cache = KingfisherManager.shared.cache

// Сохраняем в кэш с ключом "my_custom_key"
cache.store(image, forKey: "my_custom_key", toDisk: true)

// Позже можно загрузить из кэша
cache.retrieveImage(forKey: "my_custom_key") { result in
    switch result {
    case .success(let value):
        if let cachedImage = value.image {
            // Используем изображение
        }
    case .failure(let error):
        print("Ошибка получения из кэша: \(error)")
    }
}

6. retrieveImage(forKey:options:callbackQueue:completionHandler:)

Что делает: Извлекает изображение из кэша по ключу. Сначала проверяется кэш в памяти, затем на диске. Если изображение не найдено, возвращается ошибка.

Параметры:

  • forKey (String) — ключ для поиска.
  • options (KingfisherOptionsInfo?) — опции для извлечения.
  • callbackQueue (CallbackQueue?) — очередь, в которой будет вызван completionHandler.
  • completionHandler ((Result<ImageCacheResult, KingfisherError>) -> Void) — замыкание с результатом.

Пример кода:

KingfisherManager.shared.cache.retrieveImage(
    forKey: "https://example.com/image.jpg",
    options: nil
) { result in
    switch result {
    case .success(let cacheResult):
        if let image = cacheResult.image {
            print("Изображение найдено в кэше: \(cacheResult.cacheType)")
        } else {
            print("Изображение не найдено")
        }
    case .failure(let error                    

Рекомендаций