SDWebImage: ano ito, mga pangunahing konsepto at UIImageView

May-akda: IT Sectr Nai-publish: 2026-05-05 Oras ng pagbabasa: 8 min

Ang SDWebImage ay isang library para sa asynchronous na pag-load ng mga larawan sa iOS at macOS, na nagbibigay ng pinag-isang API para sa pagtatrabaho sa network, cache, at mga animation. Ayon sa data ng opisyal na repository, ang library ay ginagamit sa mahigit 100,000 proyekto at sumusuporta sa GIF, WebP, SVG, at progresibong pag-load. SDWebImage ay nagbibigay ng awtomatikong pag-cache sa disk at memorya, pati na rin ang pagsasama sa UIKit at SwiftUI.

Mga Pangunahing Punto

  • SDWebImage — library para sa asynchronous na pag-load ng mga larawan sa iOS na may suporta sa pag-cache, animation, at pagbabago.
  • SDWebImageManager — sentral na klase na nag-coordinate ng pag-load, pag-decode, at pag-cache ng mga larawan.
  • Disk Cache nag-iimbak ng mga larawan sa disk, na nagbibigay-daan sa pag-load nang walang network sa muling pagbisita.
  • WebP at GIF ay sinusuportahan sa pamamagitan ng mga plugin na SDImageWebPCoder at SDImageGIFCoder.
  • SwiftUI — ang library ay nagbibigay ng WebImage View component para sa deklaratibong pag-load ng mga larawan.

Ano ang SDWebImage?

SDWebImage — library para sa asynchronous na pag-load ng mga larawan sa mga Apple platform (iOS, macOS, tvOS, watchOS). Nagbibigay ito ng isang kategorya para sa UIImageView na may paraang sd_setImage na sa isang linya ay naglo-load, nag-cache, at nagpapakita ng larawan mula sa anumang pinagmulan.

Sinusuportahan ng library ang progresibong pag-load (ang larawan ay ipinapakita habang dumarating ang mga byte), mga animated na larawan (GIF, APNG), mga pagbabago (pag-ikot, pag-crop, pagdaragdag ng watermark), at mga custom na decoder. Ayon sa GitHub Stats, ang SDWebImage ay may higit sa 25 libong bituin at ginagamit sa malalaking aplikasyon kabilang ang Twitter, Pinterest, at Instagram.

Ang arkitektura ay binuo sa isang chain ng mga component: Coder (pag-decode), Cache (pag-iimbak), Loader (network), at Transformer (pagproseso). Ang bawat component ay mapapalitan, na nagbibigay-daan sa pag-adapt ng library sa mga partikular na pangangailangan ng proyekto.

Paano gumagana ang SDWebImage: manager at cache

SDWebImageManager — sentral na component na nag-coordinate ng proseso ng pag-load. Tumatanggap ito ng URL, sinusuri ang cache, naglo-load ng data, ni-decode ang mga ito sa UIImage, at ipinapadala sa ImageView o Completion Handler. Ang manager ay gumagana sa pamamagitan ng shared singleton, accessible mula sa anumang bahagi ng aplikasyon.

Proseso ng pag-load

Ang manager ay sunud-sunod na sinusuri ang Memory Cache (NSDictionary na may UIImage), pagkatapos ang Disk Cache (file system). Kapag walang data, isinasagawa ang network request sa pamamagitan ng NSURLSession. Pagkatapos ng pag-load, ang data ay dinedecode, dumaraan sa mga pagbabago, at nai-save sa parehong cache. Ang buong proseso ay nagaganap sa background queue, ang resulta ay ihahatid sa main queue.

  • Memory Cache — pagsusuri sa O(1), pag-iimbak ng UIImage na may pagsasaalang-alang sa limitasyon ng memorya
  • Disk Cache — pagbabasa mula sa file system, pag-iimbak ng naka-compress na data
  • NSURLSession — pag-load na may suporta sa HTTP/2 at configurable timeout

Kategorya ng UIImageView

UIImageView+WebCache — Objective-C na kategorya (accessible mula sa Swift) na nagdaragdag ng paraang sd_setImage. Ang paraang ito ay tumatanggap ng URL, placeholder, opsyon (SDWebImageOptions), at completion-block. Awtomatikong kinakansela ng kategorya ang nakaraang request kapag muling ginamit ang cell ng table sa pamamagitan ng mekanismong sd_cancelCurrentImageLoad.

Mga pangunahing klase ng SDWebImage

Ang arkitektura ng SDWebImage ay hinati sa ilang module na may malinaw na mga lugar ng responsibilidad. Bawat klase ay lumulutas ng isang gawain — mula sa pag-load hanggang sa pagpapakita.

SDWebImageManager

SDWebImageManager — facade para sa lahat ng operasyon sa mga larawan. Naglalaman ng mga reference sa ImageCache (SDImageCache) at ImageLoader (SDWebImageDownloader). Sa pamamagitan ng delegate na SDWebImageManagerDelegate, maaaring ma-intercept ang pag-load at baguhin ang URL o behavior.

SDImageCache

SDImageCache — dalawang antas na cache (memory + disk), na-initialize na may natatanging namespace. Ang Memory Cache ay nag-iimbak ng UIImage na may configurable na limitasyon (default — hanggang system memory warning). Ang Disk Cache ay nag-iimbak ng data sa directory na Library/Caches na may configurable na panahon ng pag-iimbak (default 7 araw).

SDWebImageDownloader

SDWebImageDownloader — HTTP client na batay sa NSURLSession na may suporta sa mga header, timeout, at muling pagsubok. Pinagsasama ng downloader ang magkaparehong request sa isang network call (deduplication) at ipinamahagi ang resulta sa lahat ng subscriber.

Arkitektura ng pag-cache ng SDWebImage

Ipinapatupad ng SDWebImage ang dalawang antas na pag-cache na may deterministikong pagkakasunod-sunod ng pagsusuri: una memorya, pagkatapos disk. Ang cache key ay ang absolute URL ng larawan na walang query parameter o ang MD5 hash nito.

AntasUri ng pag-iimbakNilalamanLimitasyon
Memory CacheNSCache (NSDictionary)UIImage (na-decode na Bitmap)Hanggang memory warning
Disk CacheFile systemNSData (JPEG/PNG/WebP)7 araw TTL (configurable)
Auto Purge CacheMemory + DiskPinagsamang cache ng frameworkConfigurable na laki ng file

Kapag nakatanggap ng memory warning, inaabisuhan ng iOS ang SDImageCache sa pamamagitan ng UIApplicationDidReceiveMemoryWarningNotification, pagkatapos nito ang Memory Cache ay ganap na nililinis. Ang Disk Cache ay nililinis batay sa TTL o kapag lumampas sa limitasyon, na may pag-uuri ng mga file ayon sa petsa ng huling pag-access.

Para sa manu-manong pamamahala ng cache, available ang mga paraan: clearMemory, clearDisk, calculateSize. Ang pag-cache ay maaaring i-disable para sa mga partikular na request sa pamamagitan ng opsyon na SDWebImageCacheMemoryOnly o SDWebImageAvoidAutoSetImage.

Mga halimbawa ng paggamit ng SDWebImage sa Swift

Nagbibigay ang SDWebImage ng ilang interface para sa pag-load ng mga larawan: mula sa simpleng UIImageView na kategorya hanggang sa advanced na manager na may custom na pagproseso.

Pangunahing pag-load sa UIImageView

sd_setImage — pangunahing paraan para sa pag-load ng larawan sa UIImageView. Tumatanggap ng URL, placeholder, at opsyonal na parameter sa pamamagitan ng Options at Context. Lahat ng Completion Handler ay isinasagawa sa pangunahing thread.

swift
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)]
)

Ang paraan ay nagbabalik ng SDWebImageToken (isang operasyon) na maaaring kanselahin kung kinakailangan. Sa loob, tinatawag ng sd_setImage ang SDWebImageManager.load, na ipinapasa ang ImageView bilang Target para sa awtomatikong pag-set ng larawan.

Pag-load na may custom na pagbabago

Sinusuportahan ng SDWebImage ang Transformer — isang protocol na may iisang paraan na transformedImage. Mga built-in na pagbabago: bilog, pag-ikot, paglalagay ng color filter, pagbabago ng laki. Ang pagsasama-sama ng mga pagbabago ay ginagawa gamit ang operator &&.

swift
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]
)

Paggamit sa SwiftUI

Nagbibigay ang library ng WebImage — isang View component para sa SwiftUI na may suporta sa placeholder, indicator ng progreso, at paghawak ng error. Awtomatikong nag-subscribe ang component sa lifecycle ng View at kinakansela ang pag-load kapag nawala ito.

swift
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()
            }
        }
    }
}

Image Transformations sa SDWebImage

Nagbibigay ang SDWebImage ng flexible na sistema ng pagbabago ng larawan sa pamamagitan ng protocol na SDImageTransformer. Ang mga pagbabago ay inilalapat pagkatapos ng pag-decode ngunit bago ang pag-cache — ang resulta ng pagbabago ay nai-save sa disk sa ilalim ng bagong key, na pumipigil sa muling paglalapat sa mga susunod na request.

Kasama sa mga built-in na pagbabago ang: SDImageResizingTransformer (pagbabago ng laki na may mode), SDImageRoundCornerTransformer (pag-ikot ng sulok na may opsyonal na border), SDImageFlipTransformer (pagmirror), at SDImageFilterTransformer (CoreImage filter). Ang pagsasama-sama ay ginagawa gamit ang operator &&, na lumilikha ng processing chain.

Para sa custom na pagbabago, sapat na ang pag-implement ng protocol na SDImageTransformer na may paraang transformedImageWithImage:forKey:. Ang transformation key ay awtomatikong idinaragdag sa cache key, na pumipigil sa collision sa pagitan ng iba’t ibang bersyon ng parehong larawan.

Paghahambing ng SDWebImage sa Kingfisher

Sa iOS platform, ang mga pangunahing kakumpitensya ng SDWebImage ay Kingfisher (purong Swift) at Nuke. Ang pagpili sa pagitan ng SDWebImage at Kingfisher ay madalas nakadepende sa wika ng proyekto at kinakailangang functionality.

KatangianSDWebImageKingfisher
WikaObjective-C + Swift APISwift (100%)
SwiftUIWebImage ViewKFImage View
GIFOo (built-in)Oo (built-in)
WebPOo (plugin)Oo (built-in)
Progresibong pag-loadOo (may plugin)Oo
Laki ng framework~1.2 MB~900 KB
CacheMemory + DiskMemory + Disk
Suporta sa CocoaPodsOoOo

Ang SDWebImage ay nananatiling gustong pagpilian para sa mga proyekto sa Objective-C o hybrid na proyekto. Ang Kingfisher ay mas angkop para sa purong Swift na proyekto dahil sa kaligtasan ng uri at native na Swift syntax. Ang parehong library ay may magkatulad na arkitektura ng cache at bilis.

Pag-set up ng SDWebImage sa isang iOS project

Ang pagkonekta ng SDWebImage ay ginagawa sa pamamagitan ng Swift Package Manager, CocoaPods, o Carthage. Ang library ay hinati sa mga module: pangunahing (SDWebImage), Coder (karagdagang format), at MapKit (para sa MKAnnotationView).

swift
// Swift Package Manager (Package.swift)
dependencies: [
    .package(
        url: "https://github.com/SDWebImage/SDWebImage.git",
        from: "5.19.0"
    )
]

// CocoaPods (Podfile)
pod 'SDWebImage', '~> 5.19.0'
// Mga plugin para sa WebP at SVG:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'

Pagkatapos ng installation, ang library ay handa nang gamitin nang walang karagdagang configuration. Para sa pag-customize ng cache, gumawa ng instance ng SDImageCache na may natatanging namespace, na ipinapasa sa SDWebImageManager sa initialization. Ang global configuration ay ginagawa sa pamamagitan ng SDWebImageManager.shared.

swift
// Pag-customize ng cache
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 14 na araw sa halip na 7
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

Mga Madalas Itanong

Ano ang SDWebImage at anong mga gawain ang nilulutas nito?

SDWebImage — library para sa asynchronous na pag-load ng mga larawan sa iOS at macOS. Nilulutas nito ang mga gawain ng pag-cache, pag-decode, pagbabago, at pagpapakita ng mga larawan mula sa network, na nagpapalaya sa developer mula sa manu-manong pamamahala ng thread at memorya.

Paano gamitin ang SDWebImage sa UITableView?

Sa paraang cellForRowAt gamitin ang sd_setImage na may URL at placeholder. Awtomatikong kinakansela ng library ang nakaraang request kapag muling ginamit ang cell. Para sa maayos na pag-scroll, tukuyin ang opsyon na .progressiveLoad at i-configure ang laki ng thumbnail sa pamamagitan ng context.

Paano naiiba ang SDWebImage sa Kingfisher?

SDWebImage ay nakasulat sa Objective-C na may Swift wrapper, ang Kingfisher ay nasa purong Swift. Ang SDWebImage ay may mas malawak na plugin ecosystem (WebP, SVG, MapKit). Ang Kingfisher ay nagbibigay ng mas mahusay na type safety at integration sa Swift Concurrency.

Paano magdagdag ng suporta sa WebP sa SDWebImage?

I-install ang plugin na SDWebImageWebPCoder sa pamamagitan ng CocoaPods o SPM. I-rehistro ang decoder sa pamamagitan ng pagtawag sa SDImageWebPCoder.shared sa AppDelegate. Pagkatapos ng pagpaparehistro, awtomatikong nakikita ng library ang format at dinedecode ang WebP.

Paano linisin ang SDWebImage cache programmatically?

Tawagan ang SDImageCache.shared.clearMemory() para sa memorya at SDImageCache.shared.clearDisk() para sa disk. Para sa paglilinis lamang ng mga lumang file, gamitin ang clearDisk(completion:) na may TTL check. Ang paraang calculateSizeWithCompletionBlock ay nagbabalik ng kasalukuyang laki ng cache.

Buod

  • SDWebImage — de facto na pamantayan para sa pag-load ng larawan sa iOS na may higit sa 25 libong bituin sa GitHub.
  • Dalawang antas na cache (Memory + Disk) ay nagsisiguro ng instant na pag-load ng mga paulit-ulit na larawan at offline na access.
  • Progresibong pag-load at suporta para sa GIF, WebP, SVG ay ginagawang unibersal na solusyon ang library para sa anumang format.
  • SDWebImageManager ay nagbibigay ng pinag-isang facade para sa pag-load na may kakayahang i-customize ang bawat component.
  • WebImage para sa SwiftUI ay nagpapahintulot ng deklaratibong pag-load ng larawan na may paghawak sa lahat ng estado.
  • Mga pagbabago (laki, pag-ikot, kulay) ay pinagsama gamit ang operator && at isinasagawa bago ang pag-cache.
  • Pagkatugma sa Objective-C ay ginagawang accessible ang SDWebImage para sa legacy projects nang walang migration sa Swift.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din