Kingfisher एक लाइब्रेरी है जो iOS, macOS और watchOS पर इमेज लोड करने और कैश करने के लिए है, जो शुद्ध Swift में लिखी गई है। आधिकारिक रिपॉजिटरी के अनुसार, लाइब्रेरी Swift Concurrency, Combine और SwiftUI के लिए पूर्ण समर्थन प्रदान करती है, साथ ही दो-स्तरीय स्वचालित कैशिंग भी प्रदान करती है। Kingfisher अपने टाइप-सेफ API और Swift प्रोजेक्ट्स में आसान एकीकरण के लिए जानी जाती है।
मुख्य बिंदु
Kingfisher Apple प्लेटफ़ॉर्म पर एसिंक्रोनस इमेज लोडिंग और कैशिंग के लिए एक लाइब्रेरी है, जो पूरी तरह से Swift में लिखी गई है। लाइब्रेरी के लेखक Wei Wang (onevcat) हैं। Kingfisher नेटवर्क से इमेज लोड करने के लिए टूल का एक सेट प्रदान करता है जिसमें स्वचालित कैशिंग, ट्रांसफ़ॉर्मेशन और आधुनिक Swift तकनीकों के लिए समर्थन शामिल है: async/await, Combine, Sendable।
लाइब्रेरी के GitHub पर 23,000 से अधिक स्टार हैं और इसका उपयोग Telegram, Snapchat और Dropbox जैसे एप्लिकेशन में किया जाता है। Kingfisher GIF, APNG, HEIF और सभी मानक इमेज फ़ॉर्मेट को सपोर्ट करता है। प्रत्येक अनुरोध एक टाइप-सेफ Result
Kingfisher की आर्किटेक्चर तीन मुख्य घटकों पर बनी है: Manager (डाउनलोड मैनेजर), Cache (दो-स्तरीय कैश) और Processor (ट्रांसफ़ॉर्मेशन)। ये घटक प्रोटोकॉल के माध्यम से जुड़े हुए हैं, जो निर्भरताओं को बदले बिना किसी भी भाग को बदलने की अनुमति देता है।
KingfisherManager केंद्रीय वर्ग है जो इमेज लोडिंग, कैशिंग और प्रोसेसिंग का समन्वय करता है। इसमें ImageCache और ImageDownloader के संदर्भ होते हैं और यह एकल विधि retrieveImage प्रदान करता है जो सभी चरणों से गुज़रने के बाद तैयार इमेज लौटाता है।
retrieveImage को कॉल करने पर, Manager पहले Memory Cache की जाँच करता है — UIImage के साथ एक NSCache, जहाँ कुंजी स्रोत URL और CacheSerializer से बनती है। यदि इमेज मिल जाती है, तो इसे तुरंत लौटा दिया जाता है। मिस होने पर, Disk Cache की जाँच की जाती है — serializer के माध्यम से डिक्रिप्शन के साथ फ़ाइल सिस्टम से पढ़ना। यदि डिस्क कैश खाली है, तो ImageDownloader के माध्यम से नेटवर्क अनुरोध किया जाता है, परिणाम डीकोड, ट्रांसफ़ॉर्म और दोनों कैश स्तरों में सहेजा जाता है।
संस्करण 7.0 से, Kingfisher पूरी तरह से async/await का समर्थन करता है। retrieveImage विधि एक एसिंक्रोनस फ़ंक्शन के रूप में उपलब्ध है, जो कम्प्लीशन ब्लॉक्स के बिना सीधे Result लौटाती है। यह Structured Concurrency के साथ आधुनिक Swift आर्किटेक्चर में लाइब्रेरी का उपयोग करने की अनुमति देता है।
Kingfisher कई मॉड्यूल में विभाजित है, प्रत्येक अपने कार्य को हल करता है। यह विभाजन परीक्षण और घटक प्रतिस्थापन को सरल बनाता है।
KingfisherManager एक फ़ेसेड है जो लोडिंग, कैश और प्रोसेसर को जोड़ता है। डिफ़ॉल्ट रूप से, सिंगलटन KingfisherManager.shared का उपयोग किया जाता है, लेकिन पृथक परिदृश्यों (जैसे, यूनिट टेस्ट के लिए) के लिए कस्टम सेटिंग्स के साथ एक अलग इंस्टेंस बनाया जा सकता है।
ImageCache मेमोरी और डिस्क के लिए अलग-अलग सेटिंग्स के साथ दो-स्तरीय कैश है। Memory Cache पर ऑब्जेक्ट्स की संख्या की कोई सीमा नहीं है, लेकिन मेमोरी कम होने पर सिस्टम इसे साफ़ कर देता है। Disk Cache कॉन्फ़िगरेबल TTL (डिफ़ॉल्ट 7 दिन), आकार सीमा (डिफ़ॉल्ट 0 — कोई सीमा नहीं) और स्वचालित सफ़ाई के साथ एक निर्देशिका में फ़ाइलें संग्रहीत करता है।
ImageProcessor एक एकल विधि process(item:options:) वाला प्रोटोकॉल है जो प्रोसेस्ड इमेज लौटाता है। अंतर्निहित कार्यान्वयन: ResizingImageProcessor (आकार बदलना), RoundCornerImageProcessor (गोल करना), BlurImageProcessor (गाऊसी ब्लर), 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 ImageView को Target के रूप में स्वचालित पहचान के साथ KingfisherManager.shared.retrieveImage को कॉल करता है।
Kingfisher 7.0 से, setImage विधि एक एसिंक्रोनस संस्करण में उपलब्ध है। यह बिना कॉलबैक के Swift Structured Concurrency में इमेज लोडिंग को एकीकृत करने की अनुमति देता है।
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 है, जो iOS 15 के AsyncImage के समान है, लेकिन पूर्ण 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() विधियों के साथ लागू करना आवश्यक है। यह हाइब्रिड समाधानों की अनुमति देता है: शिमर एनिमेशन के साथ स्केलेटन, क्रमिक प्रकटीकरण के साथ प्लेसहोल्डर इमेज, या अपारदर्शिता एनिमेशन के साथ लोगो। Kingfisher KingfisherManager.shared.defaultOptions के माध्यम से वैश्विक रूप से इंडिकेटर सेट करने का भी समर्थन करता है।
iOS प्लेटफ़ॉर्म पर, Kingfisher और SDWebImage दो प्रमुख इमेज लोडिंग लाइब्रेरी हैं। उनके बीच चुनाव प्रोजेक्ट की भाषा, प्रदर्शन आवश्यकताओं और इकोसिस्टम पर निर्भर करता है।
| मानदंड | Kingfisher | SDWebImage |
|---|---|---|
| भाषा | Swift (100%) | Objective-C + Swift |
| Async/Await | मूल समर्थन | रैपर के माध्यम से |
| 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 का उपयोग करें। आप डाउनलोडर टाइमआउट, कैश रणनीति और डिफ़ॉल्ट प्रोसेसर बदल सकते हैं। नीचे 14-दिवसीय TTL के साथ 500 MB कैश कॉन्फ़िगर करने का उदाहरण दिया गया है।
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 तकनीकों में पूर्ण एकीकरण के साथ नेटवर्क से इमेज को एसिंक्रोनस रूप से लोड करने, कैश करने और ट्रांसफ़ॉर्म करने के लिए किया जाता है।
Xcode में File → Add Packages के माध्यम से https://github.com/onevcat/Kingfisher.git पैकेज को 7.12.0 से संस्करण के साथ जोड़ें। या from: "7.12.0" पैरामीटर के साथ Package.swift में निर्भरता निर्दिष्ट करें। स्थापना के बाद, Kingfisher मॉड्यूल आयात करें।
Kingfisher JPEG, PNG, GIF, APNG, HEIF और WebP का समर्थन करता है। सभी फ़ॉर्मेट सिस्टम फ्रेमवर्क (ImageIO, CoreGraphics) के माध्यम से डीकोड किए जाते हैं। GIF को प्रगतिशील लोडिंग और एनिमेशन के साथ CGImageSource के माध्यम से समर्थित किया जाता है।
Kingfisher शुद्ध Swift में लिखी गई है और पूरी तरह से async/await, Combine और Sendable का समर्थन करती है। यह एक टाइप-सेफ Result API और प्रोटोकॉल के माध्यम से मॉड्यूलर आर्किटेक्चर प्रदान करती है, जो घटक प्रतिस्थापन और परीक्षण को सरल बनाती है।
Memory Cache साफ़ करने के लिए, KingfisherManager.shared.cache.clearMemoryCache() को कॉल करें। Disk Cache के लिए, clearDiskCache() का उपयोग करें। केवल समाप्त फ़ाइलों को हटाने के लिए — cleanExpiredDiskCache()। कैश आकार की जाँच cache.calculateDiskStorageSize() के माध्यम से की जा सकती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें