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 ایک HTTP کلائنٹ ہے جو NSURLSession پر مبنی ہے اور ہیڈرز، طویل انتظار اور دوبارہ کوششوں کی حمایت کرتا ہے۔ ڈاؤن لوڈر ایک جیسی درخواستوں کو ایک نیٹ ورک کال میں ڈی ڈپلیکیٹ کرتا ہے اور نتیجہ تمام سبسکرائبرز میں تقسیم کرتا ہے۔
SDWebImage ایک متعین چیک ترتیب کے ساتھ دو سطحی کیشنگ نافذ کرتا ہے: پہلے میموری، پھر ڈسک۔ کیش کی کنجی استعلام پیرامیٹرز کے بغیر مکمل URL یا اس کا MD5 ہیش ہے۔
| سطح | اسٹوریج کی قسم | مواد | حد |
|---|---|---|---|
| میموری کیش | 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 کے لیے ایک View کمپوننٹ جو placeholder، پیشرفت اشارہ اور غلطی کے انتظام کی حمایت کرتا ہے۔ یہ کمپوننٹ خودکار طور پر View کے لائف سائیکل کو سبسکرائب کرتا ہے اور غائب ہونے پر لوڈنگ منسوخ کر دیتا ہے۔
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 Swift ریپر کے ساتھ Objective-C میں لکھا گیا ہے، جبکہ 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں