SDWebImage iOS এবং macOS-এ অ্যাসিঙ্ক্রোনাস ইমেজ লোডিংয়ের জন্য একটি লাইব্রেরি, যা নেটওয়ার্ক, ক্যাশ এবং অ্যানিমেশনের সাথে কাজ করার জন্য একটি ইউনিফায়েড API প্রদান করে। অফিসিয়াল রিপোজিটরি অনুসারে, লাইব্রেরিটি 100,000-এর বেশি প্রজেক্টে ব্যবহৃত হয় এবং GIF, WebP, SVG এবং প্রগ্রেসিভ লোডিং সমর্থন করে। SDWebImage ডিস্ক এবং মেমরিতে স্বয়ংক্রিয় ক্যাশিং প্রদান করে, পাশাপাশি UIKit এবং SwiftUI-এর সাথে ইন্টিগ্রেশন।
মূল বিষয়
SDWebImage Apple প্ল্যাটফর্ম (iOS, macOS, tvOS, watchOS)-এ অ্যাসিঙ্ক্রোনাস ইমেজ লোডিংয়ের জন্য একটি লাইব্রেরি। এটি UIImageView-এর জন্য sd_setImage পদ্ধতি সহ একটি ক্যাটাগরি প্রদান করে, যা কোডের এক লাইনে যেকোনো উৎস থেকে ইমেজ লোড, ক্যাশ এবং প্রদর্শন করে।
লাইব্রেরি প্রগ্রেসিভ লোডিং (বাইট গ্রহণের সাথে সাথে ইমেজ দেখা যায়), অ্যানিমেটেড ইমেজ (GIF, APNG), ট্রান্সফর্মেশন (গোলাকার, ক্রপিং, ওয়াটারমার্কিং) এবং কাস্টম ডিকোডার সমর্থন করে। GitHub পরিসংখ্যান অনুসারে, SDWebImage-এর 25,000-এর বেশি স্টার আছে এবং এটি Twitter, Pinterest এবং Instagram-সহ প্রধান অ্যাপ্লিকেশনে ব্যবহৃত হয়।
আর্কিটেকচার একটি কম্পোনেন্ট চেইনের উপর নির্মিত: Coder (ডিকোডিং), Cache (স্টোরেজ), Loader (নেটওয়ার্ক) এবং Transformer (প্রসেসিং)। প্রতিটি কম্পোনেন্ট প্রতিস্থাপনযোগ্য, যা লাইব্রেরিকে নির্দিষ্ট প্রজেক্টের প্রয়োজনীয়তার সাথে খাপ খাইয়ে নিতে দেয়।
SDWebImageManager কেন্দ্রীয় কম্পোনেন্ট যা লোডিং প্রক্রিয়া সমন্বয় করে। এটি একটি URL গ্রহণ করে, ক্যাশ চেক করে, ডেটা লোড করে, এটি UIImage-এ ডিকোড করে এবং ImageView বা Completion Handler-এ পাঠায়। ম্যানেজার একটি শেয়ার্ড সিঙ্গলটনের মাধ্যমে কাজ করে, যা অ্যাপ্লিকেশনের যেকোনো স্থান থেকে অ্যাক্সেসযোগ্য।
ম্যানেজার ক্রমান্বয়ে মেমরি ক্যাশ (UIImage সহ NSDictionary), তারপর ডিস্ক ক্যাশ (ফাইল সিস্টেম) চেক করে। মিস হলে, NSURLSession-এর মাধ্যমে একটি নেটওয়ার্ক অনুরোধ করা হয়। লোডিংয়ের পর, ডেটা ডিকোড হয়, ট্রান্সফর্মেশনের মধ্য দিয়ে যায় এবং উভয় ক্যাশে সংরক্ষিত হয়। সম্পূর্ণ প্রক্রিয়াটি ব্যাকগ্রাউন্ড কিউতে চলে, ফলাফল মূল কিউতে বিতরণ করা হয়।
UIImageView+WebCache একটি Objective-C ক্যাটাগরি (Swift থেকে অ্যাক্সেসযোগ্য) যা sd_setImage পদ্ধতি যোগ করে। এই পদ্ধতি একটি URL, placeholder, অপশন (SDWebImageOptions) এবং একটি কমপ্লিশন ব্লক গ্রহণ করে। ক্যাটাগরি sd_cancelCurrentImageLoad মেকানিজমের মাধ্যমে টেবিল সেল পুনরায় ব্যবহার করার সময় স্বয়ংক্রিয়ভাবে পূর্ববর্তী অনুরোধ বাতিল করে।
SDWebImage আর্কিটেকচার স্পষ্ট দায়িত্বের ক্ষেত্র সহ কয়েকটি মডিউলে বিভক্ত। প্রতিটি ক্লাস একটি কাজ সমাধান করে — লোডিং থেকে প্রদর্শন পর্যন্ত।
SDWebImageManager সকল ইমেজ অপারেশনের জন্য ফেসাড। এতে ImageCache (SDImageCache) এবং ImageLoader (SDWebImageDownloader)-এর রেফারেন্স রয়েছে। SDWebImageManagerDelegate-এর মাধ্যমে, আপনি লোডিং আটকাতে এবং URL বা আচরণ পরিবর্তন করতে পারেন।
SDImageCache একটি দ্বি-স্তরের ক্যাশ (মেমরি + ডিস্ক) যা একটি অনন্য নেমস্পেস দিয়ে আরম্ভ করা হয়। মেমরি ক্যাশ UIImage কনফিগারেবল সীমা সহ সংরক্ষণ করে (ডিফল্টরূপে — সিস্টেম মেমরি সতর্কতা পর্যন্ত)। ডিস্ক ক্যাশ Library/Caches ডিরেক্টরিতে কনফিগারেবল স্টোরেজ সময়কাল (ডিফল্ট 7 দিন) সহ ডেটা সংরক্ষণ করে।
SDWebImageDownloader NSURLSession-ভিত্তিক একটি HTTP ক্লায়েন্ট যা হেডার, টাইমআউট এবং পুনরায় চেষ্টা সমর্থন করে। ডাউনলোডার একই অনুরোধগুলিকে একটি নেটওয়ার্ক কলে ডিডুপ্লিকেট করে এবং ফলাফল সকল সাবস্ক্রাইবারের মধ্যে বিতরণ করে।
SDWebImage নির্ধারক চেক অর্ডার সহ দ্বি-স্তরের ক্যাশিং প্রয়োগ করে: প্রথমে মেমরি, তারপর ডিস্ক। ক্যাশ কী হল কোয়েরি প্যারামিটার বা তার MD5 হ্যাশ ছাড়া সম্পূর্ণ ইমেজ URL।
| স্তর | স্টোরেজের ধরন | সামগ্রী | সীমা |
|---|---|---|---|
| মেমরি ক্যাশ | NSCache (NSDictionary) | UIImage (ডিকোডেড Bitmap) | মেমরি সতর্কতা পর্যন্ত |
| ডিস্ক ক্যাশ | ফাইল সিস্টেম | NSData (JPEG/PNG/WebP) | 7 দিন TTL (কনফিগারেবল) |
| অটো পার্জ ক্যাশ | মেমরি + ডিস্ক | সম্মিলিত ফ্রেমওয়ার্ক ক্যাশ | কনফিগারেবল ফাইল আকার |
মেমরি সতর্কতা গ্রহণের পর, iOS UIApplicationDidReceiveMemoryWarningNotification-এর মাধ্যমে SDImageCache-কে জানায়, যার পরে মেমরি ক্যাশ সম্পূর্ণরূপে পরিষ্কার হয়ে যায়। ডিস্ক ক্যাশ TTL দ্বারা বা সীমা অতিক্রম করলে পরিষ্কার হয়, ফাইলগুলি শেষ অ্যাক্সেসের তারিখ অনুসারে সাজিয়ে।
ম্যানুয়াল ক্যাশ ব্যবস্থাপনার জন্য নিম্নলিখিত পদ্ধতিগুলি উপলব্ধ: clearMemory, clearDisk, calculateSize. SDWebImageCacheMemoryOnly বা SDWebImageAvoidAutoSetImage অপশন ব্যবহার করে নির্দিষ্ট অনুরোধের জন্য ক্যাশিং অক্ষম করা যেতে পারে।
SDWebImage ইমেজ লোড করার জন্য বেশ কয়েকটি ইন্টারফেস প্রদান করে: সাধারণ UIImageView ক্যাটাগরি থেকে কাস্টম প্রসেসিং সহ উন্নত ম্যানেজার পর্যন্ত।
sd_setImage UIImageView-এ ইমেজ লোড করার প্রাথমিক পদ্ধতি। এটি URL, placeholder এবং Options ও Context-এর মাধ্যমে ঐচ্ছিক প্যারামিটার গ্রহণ করে। সমস্ত Completion Handler মূল থ্রেডে এক্সিকিউট হয়।
let imageView = UIImageView()
imageView.sd_setImage(
with: URL(string: "https://example.com/photo.jpg"),
placeholderImage: UIImage(named: "placeholder"),
options: [.progressiveLoad, .retryFailed],
context: [.imageThumbnailPixelSize : CGSize(width: 300, height: 300)]
)
পদ্ধতিটি একটি SDWebImageToken (অপারেশন) ফেরত দেয় যা প্রয়োজন হলে বাতিল করা যেতে পারে। অভ্যন্তরীণভাবে, sd_setImage SDWebImageManager.load কল করে, স্বয়ংক্রিয় ইমেজ সেটিংয়ের জন্য ImageView কে Target হিসেবে পাস করে।
SDWebImage Transformer — একটি একক পদ্ধতি transformedImage সহ প্রোটোকল সমর্থন করে। বিল্ট-ইন ট্রান্সফর্মেশনের মধ্যে রয়েছে: বৃত্ত, গোলাকার কোণ, রঙ ফিল্টার ওভারলে এবং আকার পরিবর্তন। && অপারেটর ব্যবহার করে ট্রান্সফর্মেশন একত্রিত করা যেতে পারে।
let transformer = SDImageResizingTransformer(
size: CGSize(width: 200, height: 200),
scaleMode: .aspectFill
)
let roundedTransformer = SDImageRoundCornerTransformer(
radius: 16,
corners: .allCorners,
borderWidth: 0
)
imageView.sd_setImage(
with: url,
placeholderImage: placeholder,
context: [.imageTransformer : transformer && roundedTransformer]
)
লাইব্রেরি WebImage — SwiftUI-এর জন্য placeholder, প্রোগ্রেস ইন্ডিকেটর এবং ত্রুটি ব্যবস্থাপনা সহ একটি ভিউ কম্পোনেন্ট প্রদান করে। কম্পোনেন্ট স্বয়ংক্রিয়ভাবে ভিউ লাইফসাইকেলে সাবস্ক্রাইব করে এবং অদৃশ্য হওয়ার সময় লোডিং বাতিল করে।
struct CachedImageView: View {
let url: URL
var body: some View {
WebImage(url: url) { phase in
if let image = phase.image {
image.resizable()
} else if phase.error {
Color.red
} else {
ProgressView()
}
}
}
}
SDWebImage SDImageTransformer প্রোটোকলের মাধ্যমে একটি নমনীয় ট্রান্সফর্মেশন সিস্টেম প্রদান করে। ট্রান্সফর্মেশন ডিকোডিংয়ের পরে কিন্তু ক্যাশিংয়ের আগে প্রয়োগ করা হয় — ট্রান্সফর্মেশন ফলাফল একটি নতুন কী-র অধীনে ডিস্কে সংরক্ষিত হয়, পরবর্তী অনুরোধে পুনরায় প্রয়োগ রোধ করে।
বিল্ট-ইন ট্রান্সফর্মেশনের মধ্যে রয়েছে: SDImageResizingTransformer (mode সহ আকার পরিবর্তন), SDImageRoundCornerTransformer (ঐচ্ছিক সীমানা সহ গোলাকার কোণ), SDImageFlipTransformer (মিররিং) এবং SDImageFilterTransformer (CoreImage ফিল্টার)। && অপারেটরের মাধ্যমে সমন্বয় করা হয়, একটি প্রসেসিং চেইন তৈরি করে।
কাস্টম ট্রান্সফর্মেশনের জন্য, transformedImageWithImage:forKey: পদ্ধতি সহ SDImageTransformer প্রোটোকল বাস্তবায়ন করাই যথেষ্ট। ট্রান্সফর্মেশন কী স্বয়ংক্রিয়ভাবে ক্যাশ কী-তে যুক্ত হয়, একই ইমেজের বিভিন্ন সংস্করণের মধ্যে সংঘর্ষ রোধ করে।
iOS প্ল্যাটফর্মে, SDWebImage-এর প্রধান প্রতিযোগী হল Kingfisher (বিশুদ্ধ Swift) এবং Nuke। SDWebImage এবং Kingfisher-এর মধ্যে পছন্দ প্রায়শই প্রজেক্টের ভাষা এবং প্রয়োজনীয় কার্যকারিতা দ্বারা নির্ধারিত হয়।
| বৈশিষ্ট্য | SDWebImage | Kingfisher |
|---|---|---|
| ভাষা | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | হ্যাঁ (অন্তর্নির্মিত) | হ্যাঁ (অন্তর্নির্মিত) |
| WebP | হ্যাঁ (প্লাগইন) | হ্যাঁ (অন্তর্নির্মিত) |
| প্রগ্রেসিভ লোডিং | হ্যাঁ (প্লাগইন সহ) | হ্যাঁ |
| ফ্রেমওয়ার্ক আকার | ~1.2 MB | ~900 KB |
| ক্যাশ | মেমরি + ডিস্ক | মেমরি + ডিস্ক |
| CocoaPods সমর্থন | হ্যাঁ | হ্যাঁ |
SDWebImage Objective-C প্রজেক্ট বা হাইব্রিড প্রজেক্টের জন্য পছন্দের পছন্দ হিসেবে রয়ে গেছে। Kingfisher টাইপ সুরক্ষা এবং নেটিভ Swift সিনট্যাক্সের কারণে বিশুদ্ধ Swift প্রজেক্টের জন্য বেশি উপযুক্ত। উভয় লাইব্রেরির একই রকম ক্যাশিং আর্কিটেকচার এবং কর্মক্ষমতা রয়েছে।
SDWebImage Swift Package Manager, CocoaPods বা Carthage-এর মাধ্যমে ইন্টিগ্রেট করা যেতে পারে। লাইব্রেরিটি মডিউলে বিভক্ত: কোর (SDWebImage), Coder (অতিরিক্ত ফর্ম্যাট) এবং MapKit (MKAnnotationView-এর জন্য)।
// Swift প্যাকেজ ম্যানেজার (Package.swift)
dependencies: [
.package(
url: "https://github.com/SDWebImage/SDWebImage.git",
from: "5.19.0"
)
]
// CocoaPods (Podfile)
pod 'SDWebImage', '~> 5.19.0'
// WebP এবং SVG-এর জন্য প্লাগইন:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
ইনস্টলেশনের পর, লাইব্রেরি অতিরিক্ত কনফিগারেশন ছাড়াই ব্যবহারের জন্য প্রস্তুত। ক্যাশ কাস্টমাইজেশনের জন্য, একটি অনন্য নেমস্পেস সহ SDImageCache-এর একটি ইনস্ট্যান্স তৈরি করুন এবং আরম্ভের সময় এটি SDWebImageManager-এ পাস করুন। গ্লোবাল কনফিগারেশন SDWebImageManager.shared-এর মাধ্যমে করা হয়।
// ক্যাশ কাস্টমাইজেশন
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 7-এর পরিবর্তে 14 দিন
config.maxDiskSize = 500 * 1024 * 1024 // 500 MB
config.shouldCacheImagesInMemory = .true
let cache = SDImageCache(
namespace: "custom",
diskCacheDirectory: FileManager.default.urls(
for: .cachesDirectory,
in: .userDomainMask
).first?.appendingPathComponent("custom_cache"),
config: config
)
SDWebImageManager.sharedImageCache = cache
প্রায়শই জিজ্ঞাসিত প্রশ্ন
SDWebImage iOS এবং macOS-এ অ্যাসিঙ্ক্রোনাস ইমেজ লোডিংয়ের জন্য একটি লাইব্রেরি। এটি নেটওয়ার্ক থেকে ইমেজ ক্যাশিং, ডিকোডিং, ট্রান্সফর্মিং এবং প্রদর্শনের সমস্যাগুলি সমাধান করে, ডেভেলপারকে ম্যানুয়াল থ্রেড এবং মেমরি ব্যবস্থাপনা থেকে মুক্ত করে।
cellForRowAt পদ্ধতিতে, URL এবং placeholder সহ sd_setImage ব্যবহার করুন। সেল পুনরায় ব্যবহার করার সময় লাইব্রেরি স্বয়ংক্রিয়ভাবে পূর্ববর্তী অনুরোধ বাতিল করে। মসৃণ স্ক্রলের জন্য, .progressiveLoad অপশন নির্দিষ্ট করুন এবং কনটেক্সটের মাধ্যমে থাম্বনেইল আকার কনফিগার করুন।
SDWebImage Objective-C-তে Swift র্যাপার সহ লেখা, যেখানে Kingfisher বিশুদ্ধ Swift-এ লেখা। SDWebImage-এর বিস্তৃত প্লাগইন ইকোসিস্টেম (WebP, SVG, MapKit) রয়েছে। Kingfisher ভালো টাইপ সুরক্ষা এবং Swift Concurrency ইন্টিগ্রেশন প্রদান করে।
CocoaPods বা SPM-এর মাধ্যমে SDWebImageWebPCoder প্লাগইন ইনস্টল করুন। AppDelegate-এ SDImageWebPCoder.shared কল করে কোডার নিবন্ধন করুন। নিবন্ধনের পর, লাইব্রেরি স্বয়ংক্রিয়ভাবে ফর্ম্যাট সনাক্ত করে এবং WebP ডিকোড করে।
মেমরির জন্য SDImageCache.shared.clearMemory() এবং ডিস্কের জন্য SDImageCache.shared.clearDisk() কল করুন। শুধুমাত্র পুরানো ফাইল পরিষ্কার করতে, TTL চেক সহ clearDisk(completion:) ব্যবহার করুন। calculateSizeWithCompletionBlock পদ্ধতি বর্তমান ক্যাশ আকার ফেরত দেয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন