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 প্রথমে মেমরি ক্যাশ পরীক্ষা করে — UIImage সহ একটি NSCache, যেখানে কী উৎস URL এবং CacheSerializer থেকে গঠিত হয়। যদি ইমেজ পাওয়া যায়, তা অবিলম্বে ফেরত দেওয়া হয়। মিস হলে, ডিস্ক ক্যাশ পরীক্ষা করা হয় — serializer-এর মাধ্যমে ডিক্রিপশন সহ ফাইল সিস্টেম থেকে পড়া। যদি ডিস্ক ক্যাশ খালি থাকে, ImageDownloader-এর মাধ্যমে একটি নেটওয়ার্ক অনুরোধ করা হয়, ফলাফল ডিকোড, রূপান্তর এবং উভয় ক্যাশ স্তরে সংরক্ষণ করা হয়।
সংস্করণ 7.0 থেকে, Kingfisher সম্পূর্ণরূপে async/await সমর্থন করে। retrieveImage পদ্ধতি একটি অ্যাসিঙ্ক্রোনাস ফাংশন হিসেবে উপলব্ধ, যা কমপ্লিশন ব্লক ছাড়াই সরাসরি Result ফেরত দেয়। এটি Structured Concurrency-সহ আধুনিক Swift আর্কিটেকচারে লাইব্রেরি ব্যবহারের অনুমতি দেয়।
Kingfisher বেশ কয়েকটি মডিউলে বিভক্ত, প্রতিটি তার নিজস্ব কাজ সমাধান করে। এই বিভাজন পরীক্ষণ এবং কম্পোনেন্ট প্রতিস্থাপন সহজ করে।
KingfisherManager হল একটি ফ্যাসাড যা লোডিং, ক্যাশ এবং প্রসেসরকে একত্রিত করে। ডিফল্টভাবে, সিঙ্গলটন KingfisherManager.shared ব্যবহার করা হয়, তবে বিচ্ছিন্ন পরিস্থিতির জন্য কাস্টম সেটিংস সহ একটি পৃথক ইনস্ট্যান্স তৈরি করা যেতে পারে (যেমন, ইউনিট টেস্টের জন্য)।
ImageCache হল মেমরি এবং ডিস্কের জন্য আলাদা সেটিংস সহ একটি দ্বি-স্তরীয় ক্যাশ। মেমরি ক্যাশে অবজেক্টের সংখ্যার কোনো সীমা নেই, তবে মেমরি কম হলে সিস্টেম এটি পরিষ্কার করে। ডিস্ক ক্যাশ কনফিগারেবল TTL (ডিফল্ট 7 দিন), আকার সীমা (ডিফল্ট 0 — কোনো সীমা নেই) এবং স্বয়ংক্রিয় পরিষ্কারসহ একটি ডিরেক্টরিতে ফাইল সংরক্ষণ করে।
ImageProcessor হল একটি একক পদ্ধতি process(item:options:) সহ একটি প্রোটোকল যা প্রক্রিয়াকৃত ইমেজ ফেরত দেয়। বিল্ট-ইন বাস্তবায়ন: ResizingImageProcessor (আকার পরিবর্তন), RoundCornerImageProcessor (গোলাকার করা), BlurImageProcessor (গাউসিয়ান ব্লার), OverlayImageProcessor (রং ওভারলে)। প্রসেসরগুলি |> অপারেটরের মাধ্যমে একত্রিত করা যেতে পারে।
Kingfisher ক্যাশ আর্কিটেকচার write-through নীতির উপর ভিত্তি করে: ডেটা একই সাথে উভয় স্তরে লেখা হয় এবং পড়া সবচেয়ে দ্রুত স্তর — মেমরি থেকে শুরু হয়। ক্যাশ কী হল কোয়েরি প্যারামিটার অপসারণের পর সম্পূর্ণ ইমেজ URL।
| প্যারামিটার | মেমরি ক্যাশ | ডিস্ক ক্যাশ |
|---|---|---|
| স্টোরেজ | NSCache (RAM) | ফাইল সিস্টেম (SSD) |
| ফরম্যাট | UIImage (ডিকোডেড) | ডেটা (সংকুচিত, serializer-এর মাধ্যমে) |
| পরিষ্কার | UIApplication.didReceiveMemoryWarningNotification | TTL + সীমা অতিক্রম |
| সিরিয়ালাইজেশন | প্রয়োজন নেই | CacheSerializer (ডিফল্ট PNG/JPEG) |
| থ্রেড নিরাপত্তা | হ্যাঁ (সিঙ্ক্রোনাইজড অ্যাক্সেস) | হ্যাঁ (IO কিউ + ব্যারিয়ার) |
ডিস্ক ক্যাশের আকার পরিচালনা করতে, শেষ অ্যাক্সেসের তারিখ অনুসারে সাজিয়ে ফাইলের মোট আকার গণনা করা হয়। যখন সীমা অতিক্রম করা হয়, সবচেয়ে পুরনো অ্যাক্সেসের তারিখের ফাইলগুলি সরানো হয় যতক্ষণ না আকার সীমার 50% এর নিচে নেমে আসে। TTL পরিষ্কার ক্যাশ ইনিশিয়ালাইজেশনের সময় এবং cleanExpired-এর প্রতিটি কলঘটলে ঘটে।
Kingfisher ইমেজ লোড করার জন্য বেশ কয়েকটি ইন্টারফেস প্রদান করে: UIImageView-তে এক্সটেনশন, একটি পৃথক ম্যানেজার এবং একটি SwiftUI ভিউ।
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 ভিউ, যা iOS 15-এর AsyncImage-এর মতো, কিন্তু সম্পূর্ণ Kingfisher ক্যাশিং সমর্থনসহ। ভিউটি স্বয়ংক্রিয়ভাবে 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 এবং প্রোটোকলের মাধ্যমে মডিউলার আর্কিটেকচার প্রদান করে, যা কম্পোনেন্ট প্রতিস্থাপন এবং পরীক্ষণ সহজ করে।
মেমরি ক্যাশ পরিষ্কার করতে, KingfisherManager.shared.cache.clearMemoryCache() কল করুন। ডিস্ক ক্যাশের জন্য, clearDiskCache() ব্যবহার করুন। শুধুমাত্র মেয়াদোত্তীর্ণ ফাইল সরাতে — cleanExpiredDiskCache()। ক্যাশের আকার cache.calculateDiskStorageSize()-এর মাধ্যমে পরীক্ষা করা যেতে পারে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন