Kingfisher adalah library untuk memuat dan menyimpan cache gambar di iOS, macOS dan watchOS, ditulis dalam Swift murni. Menurut repositori resmi, library ini menyediakan dukungan penuh untuk Swift Concurrency, Combine dan SwiftUI, serta caching otomatis dua tingkat. Kingfisher dikenal dengan API yang aman tipe dan integrasi mudah dengan proyek Swift.
Poin Penting
Kingfisher — library untuk memuat dan menyimpan cache gambar secara asinkron di platform Apple, ditulis sepenuhnya dalam Swift. Penulis library ini adalah Wei Wang (onevcat). Kingfisher menyediakan seperangkat alat untuk memuat gambar dari jaringan dengan caching otomatis, transformasi dan dukungan untuk teknologi Swift modern: async/await, Combine, Sendable.
Library ini memiliki lebih dari 23.000 bintang di GitHub dan digunakan di aplikasi seperti Telegram, Snapchat dan Dropbox. Kingfisher mendukung GIF, APNG, HEIF dan semua format gambar standar. Setiap permintaan mengembalikan Result
Arsitektur Kingfisher dibangun di atas tiga komponen utama: Manager (manajer pemuatan), Cache (cache dua tingkat) dan Processor (transformasi). Komponen-komponen ini terhubung melalui protokol, memungkinkan penggantian bagian mana pun tanpa mengubah dependensi.
KingfisherManager — kelas pusat yang mengoordinasikan pemuatan, caching dan pemrosesan gambar. Ini berisi referensi ke ImageCache dan ImageDownloader dan menyediakan metode terpadu retrieveImage yang mengembalikan gambar siap setelah melewati semua tahap.
Saat retrieveImage dipanggil, Manager pertama-tama memeriksa Memory Cache — NSCache dengan UIImage, di mana kunci dibentuk dari URL sumber dan CacheSerializer. Jika gambar ditemukan — segera dikembalikan. Jika tidak ada, Disk Cache diperiksa — membaca dari sistem file dengan dekripsi melalui serializer. Jika cache di disk kosong, permintaan jaringan dijalankan melalui ImageDownloader, hasilnya didekode, ditransformasi dan disimpan di kedua tingkat cache.
Mulai versi 7.0, Kingfisher sepenuhnya mendukung async/await. Metode retrieveImage tersedia sebagai fungsi asinkron yang mengembalikan Result secara langsung tanpa blok completion. Ini memungkinkan penggunaan library dalam arsitektur Swift modern dengan Structured Concurrency.
Kingfisher dibagi menjadi beberapa modul, masing-masing menyelesaikan tugasnya sendiri. Pembagian ini menyederhanakan pengujian dan penggantian komponen.
KingfisherManager — facade yang menggabungkan pemuatan, cache dan prosesor. Secara default, singleton KingfisherManager.shared digunakan, tetapi instance terpisah dengan pengaturan kustom dapat dibuat untuk skenario terisolasi (misalnya untuk pengujian unit).
ImageCache — cache dua tingkat dengan pengaturan terpisah untuk memori dan disk. Memory Cache tidak memiliki batasan jumlah objek, tetapi dibersihkan oleh sistem saat memori habis. Disk Cache menyimpan file di direktori dengan pengaturan TTL (default 7 hari), batas ukuran (default 0 — tanpa batas) dan pembersihan otomatis.
ImageProcessor — protokol dengan metode tunggal process(item:options:) yang mengembalikan gambar yang diproses. Implementasi bawaan: ResizingImageProcessor (ubah ukuran), RoundCornerImageProcessor (pembulatan), BlurImageProcessor (pengaburan Gaussian), OverlayImageProcessor (penambahan warna). Prosesor dapat digabungkan dengan operator |>.
Arsitektur cache Kingfisher didasarkan pada prinsip write-through: data ditulis secara bersamaan di kedua tingkat, dan pembacaan dimulai dari tingkat tercepat — memori. Kunci cache adalah URL absolut gambar setelah menghapus parameter kueri.
| Parameter | Memory Cache | Disk Cache |
|---|---|---|
| Penyimpanan | NSCache (RAM) | Sistem file (SSD) |
| Format | UIImage (didekode) | Data (dikompresi, melalui serializer) |
| Pembersihan | UIApplication.didReceiveMemoryWarningNotification | TTL + melampaui batas |
| Serialisasi | Tidak diperlukan | CacheSerializer (default PNG/JPEG) |
| Keamanan thread | Ya (akses tersinkronisasi) | Ya (antrian IO + penghalang) |
Untuk mengelola ukuran Disk Cache, digunakan perhitungan total ukuran file dengan pengurutan berdasarkan tanggal akses terakhir. Saat batas terlampaui, file dengan tanggal akses tertua dihapus hingga ukuran turun di bawah 50% dari batas. Pembersihan TTL terjadi saat inisialisasi cache dan setiap panggilan cleanExpired.
Kingfisher menyediakan beberapa antarmuka untuk memuat gambar: ekstensi pada UIImageView, manajer terpisah dan SwiftUI View.
kf — properti namespace pada UIImageView yang menyediakan metode setImage, cancelDownload dan indikator pemuatan. Metode setImage menerima URLSource dan parameter opsional Options dan completionHandler.
import Kingfisher
imageView.kf.setImage(
with: URL(string: "https://example.com/image.jpg"),
placeholder: UIImage(named: "placeholder"),
options: [
.processor(RoundCornerImageProcessor(radius: .point(12))),
.transition(.fade(0.3)),
.cacheMemoryOnly
],
progressBlock: { receivedSize, totalSize in
print("Dimuat \(receivedSize) / \(totalSize)")
}
)
Metode mengembalikan DownloadTask, yang mendukung pembatalan melalui cancel dan pelacakan kemajuan. Di dalamnya, setImage memanggil KingfisherManager.shared.retrieveImage dengan penentuan otomatis ImageView sebagai Target.
Mulai Kingfisher 7.0, metode setImage tersedia dalam versi asinkron. Ini memungkinkan integrasi pemuatan gambar ke dalam Swift Structured Concurrency tanpa callback.
func loadAvatar() async {
do {
let result = try await imageView.kf.setImage(
with: url,
options: [.processor(ResizingImageProcessor(
targetSize: CGSize(width: 100, height: 100)
))]
)
// result.image berisi UIImage
} catch {
print("Gagal: \(error)")
}
}
KFImage — SwiftUI View, mirip dengan AsyncImage dari iOS 15, tetapi dengan dukungan penuh caching Kingfisher. View secara otomatis menggunakan KingfisherManager.shared, tetapi mendukung manajer kustom melalui pengubah .configure.
struct AvatarView: View {
let url: URL
var body: some View {
KFImage(url)
.placeholder { ProgressView() }
.resizable()
.fade(duration: 0.25)
.forceTransition()
.frame(width: 80, height: 80)
.cornerRadius(40)
}
}
Kingfisher menyediakan sistem indikator bawaan untuk menampilkan kemajuan pemuatan gambar. IndicatorType — enumerasi dengan tiga varian: .activity (UIActivityIndicatorView), .progress (UIProgressView) dan .custom (implementasi kustom protokol Indicator). Indikator secara otomatis ditampilkan di ImageView selama pemuatan dan disembunyikan setelah selesai.
Untuk indikator kustom, protokol Indicator harus diimplementasikan dengan metode startAnimatingView() dan stopAnimatingView(). Ini memungkinkan penggunaan solusi hibrida: kerangka dengan animasi shimmer, gambar placeholder dengan kemunculan bertahap atau logo dengan animasi transparansi. Kingfisher juga mendukung pengaturan indikator secara global melalui KingfisherManager.shared.defaultOptions.
Di platform iOS, Kingfisher dan SDWebImage adalah dua library dominan untuk pemuatan gambar. Pilihan di antara mereka tergantung pada bahasa proyek, persyaratan kinerja dan ekosistem.
| Kriteria | Kingfisher | SDWebImage |
|---|---|---|
| Bahasa | Swift (100%) | Objective-C + Swift |
| Async/Await | Dukungan asli | Melalui pembungkus |
| Combine | Publisher bawaan | Tidak |
| Sendable | Mendukung | Terbatas |
| Keamanan tipe | Penuh (tipe Result) | Melalui Any? |
| ImageProcessor | Composite melalui |> | Transformer melalui && |
| Ukuran | ~900 KB | ~1.2 MB |
| Bintang GitHub | 23.000+ | 25.000+ |
Keunggulan utama Kingfisher adalah arsitektur Swift-first: dukungan penuh untuk async/await, Combine Publishers, Sendable dan tipe Result. SDWebImage mempertahankan kepemimpinan karena ekosistem plugin yang lebih luas (WebP, SVG, MapKit) dan dukungan Objective-C.
Kingfisher diinstal melalui Swift Package Manager, CocoaPods atau Carthage. Setelah instalasi, cukup impor modul dan panggil metode pemuatan apa pun — library siap digunakan tanpa konfigurasi tambahan.
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/onevcat/Kingfisher.git",
from: "7.12.0"
)
]
// CocoaPods (Podfile)
pod 'Kingfisher', '~> 7.12'
Untuk menyesuaikan pengaturan global, gunakan KingfisherManager.shared. Timeout loader, strategi cache dan prosesor default dapat diubah. Berikut adalah contoh konfigurasi cache 500 MB dengan TTL 14 hari.
let cache = ImageCache(name: "custom")
cache.memoryStorage.config.totalCostLimit = 100 * 1024 * 1024
cache.diskStorage.config.sizeLimit = 500 * 1024 * 1024
cache.diskStorage.config.expiration = .days(14)
KingfisherManager.shared.cache = cache
ImageDownloader juga dikonfigurasi melalui manajer: URLSessionConfiguration kustom dengan timeout, header dan kebijakan cache dapat diatur. Untuk memantau kemajuan, modul KFIndicator tersedia dengan dukungan ActivityIndicator, ProgressView dan indikator kustom.
Pertanyaan Umum
Kingfisher — library pemuatan gambar untuk iOS yang ditulis dalam Swift murni. Digunakan untuk memuat, menyimpan cache dan mentransformasi gambar dari jaringan secara asinkron dengan integrasi penuh ke SwiftUI, UIKit dan teknologi Swift modern.
Tambahkan paket https://github.com/onevcat/Kingfisher.git dengan versi dari 7.12.0 di Xcode melalui File → Add Packages. Atau tentukan dependensi di Package.swift dengan parameter from: “7.12.0”. Setelah instalasi, impor modul Kingfisher.
Kingfisher mendukung JPEG, PNG, GIF, APNG, HEIF dan WebP. Semua format didekode melalui framework sistem (ImageIO, CoreGraphics). GIF didukung melalui CGImageSource dengan pemuatan progresif dan animasi.
Kingfisher ditulis dalam Swift murni dan sepenuhnya mendukung async/await, Combine dan Sendable. Ini menyediakan API Result yang aman tipe dan arsitektur modular melalui protokol, menyederhanakan penggantian komponen dan pengujian.
Untuk membersihkan Memory Cache, panggil KingfisherManager.shared.cache.clearMemoryCache(). Untuk Disk Cache gunakan clearDiskCache(). Untuk menghapus hanya file yang kedaluwarsa — cleanExpiredDiskCache(). Ukuran cache diperiksa melalui cache.calculateDiskStorageSize().
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga