Kingfisher เป็นไลบรารีสำหรับโหลดและแคชรูปภาพบน iOS, macOS และ watchOS ซึ่งเขียนด้วย Swift บริสุทธิ์ ตามคลังเก็บอย่างเป็นทางการ ไลบรารีรองรับ Swift Concurrency, Combine และ SwiftUI อย่างเต็มรูปแบบ รวมถึงการแคชอัตโนมัติสองระดับ Kingfisher มีชื่อเสียงในด้าน API ที่ปลอดภัยชนิดข้อมูลและการผสานรวมที่ง่ายกับโปรเจกต์ Swift
ประเด็นสำคัญ
Kingfisher เป็นไลบรารีสำหรับการโหลดและแคชรูปภาพแบบอะซิงโครนัสบนแพลตฟอร์ม Apple ซึ่งเขียนด้วย Swift ทั้งหมด ผู้เขียนไลบรารีคือ Wei Wang (onevcat) Kingfisher ให้ชุดเครื่องมือสำหรับโหลดรูปภาพจากเครือข่ายพร้อมการแคชอัตโนมัติ การแปลง และการรองรับเทคโนโลยี Swift สมัยใหม่: async/await, Combine, Sendable
ไลบรารีมีดาวมากกว่า 23,000 ดาว บน GitHub และใช้ในแอปพลิเคชันอย่าง Telegram, Snapchat และ Dropbox Kingfisher รองรับ GIF, APNG, HEIF และรูปแบบรูปภาพมาตรฐานทั้งหมด คำขอแต่ละครั้งส่งคืน Result
สถาปัตยกรรมของ Kingfisher สร้างขึ้นบนสามคอมโพเนนต์หลัก: Manager (ตัวจัดการดาวน์โหลด), Cache (แคชสองระดับ) และ Processor (การแปลง) คอมโพเนนต์เหล่านี้เชื่อมต่อผ่านโปรโตคอล ทำให้สามารถเปลี่ยนส่วนใดก็ได้โดยไม่ต้องเปลี่ยน dependencies
KingfisherManager เป็นคลาสกลางที่ประสานงานการโหลด การแคช และการประมวลผลรูปภาพ ประกอบด้วยการอ้างอิงถึง ImageCache และ ImageDownloader และให้เมธอดเดียว retrieveImage ที่ส่งคืนรูปภาพที่พร้อมใช้งานหลังจากผ่านทุกขั้นตอน
เมื่อเรียก retrieveImage Manager จะตรวจสอบ Memory Cache ก่อน — NSCache ที่มี UIImage ซึ่งคีย์ถูกสร้างจาก URL ต้นทางและ CacheSerializer หากพบรูปภาพ จะส่งคืนทันที หากไม่พบ จะตรวจสอบ Disk Cache — การอ่านจากระบบไฟล์ด้วยการถอดรหัสผ่าน serializer หากแคชดิสก์ว่างเปล่า จะทำคำขอเครือข่ายผ่าน ImageDownloader ผลลัพธ์จะถูกถอดรหัส แปลง และบันทึกในแคชทั้งสองระดับ
ตั้งแต่เวอร์ชัน 7.0 Kingfisher รองรับ async/await อย่างเต็มรูปแบบ เมธอด retrieveImage พร้อมใช้งานเป็นฟังก์ชันอะซิงโครนัสที่ส่งคืน Result โดยตรงโดยไม่ต้องมีบล็อกการเสร็จสิ้น ทำให้สามารถใช้ไลบรารีในสถาปัตยกรรม Swift สมัยใหม่ด้วย Structured Concurrency
Kingfisher แบ่งออกเป็นหลายโมดูล แต่ละโมดูลแก้ปัญหาของตัวเอง การแบ่งส่วนนี้ช่วยให้การทดสอบและการเปลี่ยนคอมโพเนนต์ง่ายขึ้น
KingfisherManager เป็นส่วนหน้าอาคารที่รวมการโหลด แคช และตัวประมวลผล โดยค่าเริ่มต้น จะใช้ซิงเกิลตัน KingfisherManager.shared แต่สามารถสร้างอินสแตนซ์แยกต่างหากด้วยการตั้งค่าที่กำหนดเองสำหรับสถานการณ์ที่แยกออกมา (เช่น สำหรับการทดสอบหน่วย)
ImageCache เป็นแคชสองระดับพร้อมการตั้งค่าแยกต่างหากสำหรับหน่วยความจำและดิสก์ Memory Cache ไม่มีขีดจำกัดจำนวนวัตถุ แต่ระบบจะล้างเมื่อหน่วยความจำต่ำ Disk Cache จัดเก็บไฟล์ในไดเรกทอรีด้วย TTL ที่กำหนดค่าได้ (ค่าเริ่มต้น 7 วัน) ขีดจำกัดขนาด (ค่าเริ่มต้น 0 — ไม่จำกัด) และการล้างอัตโนมัติ
ImageProcessor เป็นโปรโตคอลที่มีเมธอดเดียว process(item:options:) ที่ส่งคืนรูปภาพที่ประมวลผลแล้ว การใช้งานในตัว: ResizingImageProcessor (ปรับขนาด), RoundCornerImageProcessor (ทำมุมมน), BlurImageProcessor (เบลอแบบ Gaussian), OverlayImageProcessor (วางซ้อนสี) ตัวประมวลผลสามารถรวมกันได้โดยใช้ตัวดำเนินการ |>
สถาปัตยกรรมแคชของ Kingfisher อิงตามหลักการ write-through: ข้อมูลถูกเขียนไปยังทั้งสองระดับพร้อมกัน และการอ่านเริ่มจากระดับที่เร็วที่สุด — หน่วยความจำ คีย์แคชคือ URL สัมบูรณ์ของรูปภาพหลังจากลบพารามิเตอร์คำค้นหา
| พารามิเตอร์ | Memory Cache | Disk Cache |
|---|---|---|
| พื้นที่จัดเก็บ | NSCache (RAM) | ระบบไฟล์ (SSD) |
| รูปแบบ | UIImage (ถอดรหัสแล้ว) | ข้อมูล (บีบอัด ผ่าน serializer) |
| การล้าง | UIApplication.didReceiveMemoryWarningNotification | TTL + เกินขีดจำกัด |
| การทำให้เป็นลำดับ | ไม่จำเป็น | CacheSerializer (ค่าเริ่มต้น PNG/JPEG) |
| ความปลอดภัยของเธรด | ใช่ (การเข้าถึงแบบซิงโครไนซ์) | ใช่ (คิว IO + สิ่งกีดขวาง) |
ในการจัดการขนาด Disk Cache จะคำนวณขนาดไฟล์ทั้งหมดโดยเรียงตามวันที่เข้าถึงล่าสุด เมื่อเกินขีดจำกัด ไฟล์ที่มีวันที่เข้าถึงเก่าที่สุดจะถูกลบจนกว่าขนาดจะต่ำกว่า 50% ของขีดจำกัด การล้าง TTL เกิดขึ้นระหว่างการเริ่มต้นแคชและทุกครั้งที่เรียก cleanExpired
Kingfisher มีอินเทอร์เฟซหลายแบบสำหรับโหลดรูปภาพ: ส่วนขยายบน UIImageView, ตัวจัดการแยกต่างหาก และ SwiftUI View
kf เป็นคุณสมบัติเนมสเปซบน UIImageView ที่ให้เมธอด setImage, cancelDownload และตัวบ่งชี้การโหลด เมธอด setImage รับ URLSource และพารามิเตอร์เสริม Options และ 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("โหลดแล้ว \(receivedSize) / \(totalSize)")
}
)
เมธอดส่งคืน DownloadTask ที่รองรับการยกเลิกผ่าน cancel และการติดตามความคืบหน้า ภายใน setImage เรียก KingfisherManager.shared.retrieveImage พร้อมการตรวจจับ ImageView เป็น Target โดยอัตโนมัติ
ตั้งแต่ Kingfisher 7.0 เมธอด setImage พร้อมใช้งานในเวอร์ชันอะซิงโครนัส ซึ่งช่วยให้สามารถผสานรวมการโหลดรูปภาพเข้ากับ Swift Structured Concurrency โดยไม่ต้องใช้ 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 มี UIImage
} catch {
print("ล้มเหลว: \(error)")
}
}
KFImage เป็น SwiftUI View คล้ายกับ AsyncImage จาก iOS 15 แต่รองรับแคชของ Kingfisher อย่างเต็มรูปแบบ View ใช้ KingfisherManager.shared โดยอัตโนมัติแต่รองรับตัวจัดการที่กำหนดเองผ่านตัวปรับแต่ง .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 มีระบบตัวบ่งชี้ในตัวสำหรับแสดงความคืบหน้าของการโหลดรูปภาพ IndicatorType เป็นการแจงนับที่มีสามตัวเลือก: .activity (UIActivityIndicatorView), .progress (UIProgressView) และ .custom (การใช้งานโปรโตคอล Indicator แบบกำหนดเอง) ตัวบ่งชี้จะปรากฏเหนือ ImageView โดยอัตโนมัติระหว่างการโหลดและซ่อนหลังจากเสร็จสิ้น
สำหรับตัวบ่งชี้ที่กำหนดเอง จำเป็นต้องใช้โปรโตคอล Indicator ด้วยเมธอด startAnimatingView() และ stopAnimatingView() ซึ่งช่วยให้มีโซลูชันแบบไฮบริด: โครงกระดูกพร้อมภาพเคลื่อนไหว shimmer, รูปภาพ placeholder พร้อมการเปิดเผยทีละน้อย หรือโลโก้พร้อมภาพเคลื่อนไหวความโปร่งใส Kingfisher ยังรองรับการตั้งค่าตัวบ่งชี้ทั่วโลกผ่าน KingfisherManager.shared.defaultOptions
บนแพลตฟอร์ม iOS Kingfisher และ SDWebImage เป็นไลบรารีโหลดรูปภาพที่โดดเด่นสองแห่ง การเลือกระหว่างทั้งสองขึ้นอยู่กับภาษาโปรเจกต์ ข้อกำหนดด้านประสิทธิภาพ และระบบนิเวศ
| เกณฑ์ | Kingfisher | SDWebImage |
|---|---|---|
| ภาษา | Swift (100%) | Objective-C + Swift |
| Async/Await | รองรับโดยกำเนิด | ผ่าน wrapper |
| Combine | Publisher ในตัว | ไม่มี |
| Sendable | รองรับ | จำกัด |
| ความปลอดภัยชนิด | สมบูรณ์ (ชนิด Result) | ผ่าน Any? |
| ImageProcessor | ประกอบผ่าน |> | Transformer ผ่าน && |
| ขนาด | ~900 KB | ~1.2 MB |
| ดาว GitHub | 23,000+ | 25,000+ |
ข้อได้เปรียบหลักของ Kingfisher คือสถาปัตยกรรม Swift-first: รองรับ async/await, Combine Publishers, Sendable และชนิด Result อย่างเต็มรูปแบบ SDWebImage รักษาความเป็นผู้นำด้วยระบบนิเวศปลั๊กอินที่กว้างขึ้น (WebP, SVG, MapKit) และการรองรับ Objective-C
Kingfisher ติดตั้งผ่าน Swift Package Manager, CocoaPods หรือ Carthage หลังจากติดตั้ง เพียงนำเข้าโมดูลและเรียกเมธอดการโหลดใดๆ — ไลบรารีพร้อมใช้งานโดยไม่ต้องกำหนดค่าเพิ่มเติม
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/onevcat/Kingfisher.git",
from: "7.12.0"
)
]
// CocoaPods (Podfile)
pod 'Kingfisher', '~> 7.12'
สำหรับการปรับแต่งการตั้งค่าทั่วโลก ใช้ KingfisherManager.shared สามารถเปลี่ยนการหมดเวลาของตัวดาวน์โหลด กลยุทธ์แคช และตัวประมวลผลเริ่มต้น ด้านล่างเป็นตัวอย่างการกำหนดค่าแคช 500 MB ด้วย TTL 14 วัน
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 ยังถูกกำหนดค่าผ่านตัวจัดการ: สามารถตั้งค่า URLSessionConfiguration ที่กำหนดเองพร้อมการหมดเวลา ส่วนหัว และนโยบายแคช สำหรับการติดตามความคืบหน้า มีโมดูล KFIndicator พร้อมรองรับ ActivityIndicator, ProgressView และตัวบ่งชี้ที่กำหนดเอง
คำถามที่พบบ่อย
Kingfisher เป็นไลบรารีสำหรับโหลดรูปภาพบน iOS เขียนด้วย Swift บริสุทธิ์ ใช้สำหรับโหลด แคช และแปลงรูปภาพจากเครือข่ายแบบอะซิงโครนัสพร้อมการผสานรวมอย่างสมบูรณ์กับ SwiftUI, UIKit และเทคโนโลยี Swift สมัยใหม่
เพิ่มแพ็กเกจ https://github.com/onevcat/Kingfisher.git ด้วยเวอร์ชันตั้งแต่ 7.12.0 ใน Xcode ผ่าน File → Add Packages หรือระบุ dependencies ใน Package.swift ด้วยพารามิเตอร์ from: "7.12.0" หลังจากติดตั้ง ให้นำเข้าโมดูล Kingfisher
Kingfisher รองรับ JPEG, PNG, GIF, APNG, HEIF และ WebP ทุกรูปแบบถูกถอดรหัสผ่านเฟรมเวิร์กระบบ (ImageIO, CoreGraphics) GIF รองรับผ่าน CGImageSource พร้อมการโหลดแบบก้าวหน้าและภาพเคลื่อนไหว
Kingfisher เขียนด้วย Swift บริสุทธิ์และรองรับ async/await, Combine และ Sendable อย่างเต็มรูปแบบ มี API แบบ Result ที่ปลอดภัยชนิดและสถาปัตยกรรมแบบโมดูลาร์ผ่านโปรโตคอล ซึ่งช่วยให้เปลี่ยนคอมโพเนนต์และการทดสอบง่ายขึ้น
ในการล้าง Memory Cache ให้เรียก KingfisherManager.shared.cache.clearMemoryCache() สำหรับ Disk Cache ใช้ clearDiskCache() หากต้องการลบเฉพาะไฟล์ที่หมดอายุ — cleanExpiredDiskCache() ขนาดแคสสามารถตรวจสอบได้ผ่าน cache.calculateDiskStorageSize()
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ