SDWebImageとは何か、主な概念とUIImageView

著者: IT Sectr 公開日: 2026-05-05 読了時間: 8 分

SDWebImageはiOSおよびmacOSでの非同期画像読み込みのためのライブラリで、ネットワーク、キャッシュ、アニメーションを統一的に扱うAPIを提供します。公式リポジトリによると、このライブラリは100,000以上のプロジェクトで使用され、GIF、WebP、SVG、プログレッシブロードをサポートしています。SDWebImageはディスクおよびメモリの自動キャッシュ、そしてUIKitやSwiftUIとの統合を提供します。

ポイント

  • SDWebImageはiOSでの非同期画像読み込みのためのライブラリで、キャッシュ、アニメーション、変換をサポートしています。
  • SDWebImageManagerは画像の読み込み、デコード、キャッシュを統括する中心クラスです。
  • ディスクキャッシュは画像をストレージに保存し、後のアクセス時にオフライン読み込みを可能にします。
  • WebPおよびGIFはSDImageWebPCoderおよびSDImageGIFCoderプラグインを通じてサポートされています。
  • SwiftUI — ライブラリは宣言的な画像読み込みのためのWebImageビューコンポーネントを提供しています。

SDWebImageとは?

SDWebImageはAppleプラットフォーム(iOS、macOS、tvOS、watchOS)での非同期画像読み込みのためのライブラリです。UIImageViewのためのsd_setImageメソッドを提供し、コード一行でどのようなソースからでも画像を読み込み、キャッシュし、表示します。

このライブラリはプログレッシブロード(バイトを受信するにつれて画像が表示される)、アニメーション画像(GIF、APNG)、変換(丸み、クロップ、ウォーターマーク)、カスタムデコーダーをサポートしています。GitHub統計によると、SDWebImageは25,000以上のスターを持ち、Twitter、Pinterest、Instagramなどの主要アプリで使用されています。

アーキテクチャはコンポーネントチェーンで構築されています:Coder(デコーディング)、Cache(ストレージ)、Loader(ネットワーク)、Transformer(処理)。各コンポーネントは置き換え可能で、ライブラリをプロジェクトの特定の要件に適応させることができます。

SDWebImageの仕組み:マネージャーとキャッシュ

SDWebImageManagerは読み込みプロセスを統括する中心コンポーネントです。URLを受け取り、キャッシュを確認し、データを読み込み、UIImageにデコードし、ImageViewまたはCompletion Handlerに渡します。マネージャーは共有シングルトンを通じて動作し、アプリケーションのどこからでもアクセスできます。

読み込みプロセス

マネージャーはメモリキャッシュ(UIImageを持つNSDictionary)、ついでディスクキャッシュ(ファイルシステム)を順番に確認します。ミスした場合は、NSURLSessionを通じてネットワークリクエストが行われます。読み込み後、データはデコードされ、変換を経て、両方のキャッシュに保存されます。すべてのプロセスはバックグラウンドキューで実行され、結果はメインキューに届けられます。

  • メモリキャッシュ — O(1)の参照、設定可能なメモリ制限でUIImageを保存
  • ディスクキャッシュ — ファイルシステムから読み込み、圧縮データを保存
  • NSURLSession — HTTP/2サポートと設定可能なタイムアウトで読み込み

UIImageViewカテゴリ

UIImageView+WebCacheはObjective-Cのカテゴリ(Swiftからアクセス可能)で、sd_setImageメソッドを追加します。このメソッドはURL、placeholder、オプション(SDWebImageOptions)、コンプリーションブロックを受け取ります。このカテゴリはsd_cancelCurrentImageLoadメカニズムを通じて、テーブルセルが再利用されたときに前回のリクエストを自動的にキャンセルします。

SDWebImageの主なクラス

SDWebImageのアーキテクチャは明確な責任範囲を持つ複数のモジュールに分かれています。各クラスは読み込みから表示までの1つの任務を解決します。

SDWebImageManager

SDWebImageManagerはすべての画像操作のファザードです。ImageCache(SDImageCache)およびImageLoader(SDWebImageDownloader)への参照を保持しています。SDWebImageManagerDelegateを通じて、読み込みを拦戮してURLや動作を変更できます。

SDImageCache

SDImageCacheは2レベルキャッシュ(メモリ + ディスク)で、固有のネームスペースで初期化されます。メモリキャッシュは設定可能な制限付きでUIImageを保存します(デフォルトではシステムメモリ警告まで)。ディスクキャッシュはLibrary/Cachesディレクトリに、設定可能な保存期間(デフォルト7日)でデータを保存します。

SDWebImageDownloader

SDWebImageDownloaderはNSURLSessionベースのHTTPクライアントで、ヘッダー、タイムアウト、再試行をサポートしています。ダウンローダーは同じリクエストを1つのネットワークコールに重複解除し、結果をすべてのサブスクライバーに分配します。

SDWebImageのキャッシュアーキテクチャ

SDWebImageは決定的な確認順序で2レベルのキャッシュを実装しています:最初にメモリ、その後にディスクです。キャッシュキーは、クエリパラメータのない絶対画像URLか、そのMD5ハッシュです。

レベルストレージ種類内容制限
メモリキャッシュNSCache (NSDictionary)UIImage (デコード済みBitmap)メモリ警告まで
ディスクキャッシュファイルシステムNSData (JPEG/PNG/WebP)7日 TTL (設定可能)
自動パージキャッシュメモリ + ディスクフレームワークの統合キャッシュ設定可能なファイルサイズ

メモリ警告を受けると、iOSはUIApplicationDidReceiveMemoryWarningNotificationを通じてSDImageCacheに通知し、その後メモリキャッシュは完全にクリアされます。ディスクキャッシュはTTLまたは制限を超えた場合にクリアされ、ファイルは最終アクセス日の順に並べ替えられます。

手動キャッシュ管理には、次のメソッドが利用可能です:clearMemoryclearDiskcalculateSize。SDWebImageCacheMemoryOnlyまたはSDWebImageAvoidAutoSetImageオプションを使用して、特定のリクエストのキャッシュを無効にできます。

SwiftでのSDWebImage使用例

SDWebImageは画像を読み込むためのいくつかのインターフェースを提供しています:シンプルなUIImageViewカテゴリから、カスタム処理をサポートする高度なマネージャーまで。

UIImageViewでの基本的な読み込み

sd_setImageはUIImageViewに画像を読み込むための主なメソッドです。URL、placeholder、OptionsおよびContextを通じたオプショナルパラメーターを受け取ります。すべてのCompletion Handlerはメインスレッドで実行されます。

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

このメソッドはSDWebImageToken(操作)を戻し、必要に応じてキャンセルできます。内部的に、sd_setImageはSDWebImageManager.loadを呼び出し、自動画像設定のためにImageViewをTargetとして渡します。

カスタム変換での読み込み

SDWebImageはTransformer—単一のtransformedImageメソッドを持つプロトコルをサポートしています。組み込みの変換には、円、丸く角、カラーフィルターオーバーレイ、サイズ変更があります。変換は&&演算子を使用して組み合わせることができます。

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

SwiftUIでの使用

このライブラリはWebImage—placeholder、進行状況インジケータ、エラー処理をサポートするSwiftUI用のビューコンポーネントを提供しています。このコンポーネントは自動的にビューのライフサイクルにサブスクライブし、消失時に読み込みをキャンセルします。

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

SDWebImageでの画像変換

SDWebImageはSDImageTransformerプロトコルを通じて柔軟な変換システムを提供しています。変換はデコーディング後、キャッシュ前に適用されます—変換結果は新しいキーでディスクに保存され、後のリクエストでの再適用を防ぎます。

組み込みの変換には次のものがあります:SDImageResizingTransformer(mode付きサイズ変更)、SDImageRoundCornerTransformer(オプションの置きます

カスタム変換には、transformedImageWithImage:forKey:メソッドでSDImageTransformerプロトコルを実装すればそれで十分です。変換キーは自動的にキャッシュキーに追加され、同じ画像の異なるバージョン間の競合を防ぎます。

SDWebImageとKingfisherの比較

iOSプラットフォームにおけるSDWebImageの主な競合相手はKingfisher(純粋Swift)とNukeです。SDWebImageとKingfisherの選択は、プロジェクトの言語と必要な機能によって決まります。

特徴SDWebImageKingfisher
言語Objective-C + Swift APISwift (100%)
SwiftUIWebImage ViewKFImage View
GIFはい(組み込み)はい(組み込み)
WebPはい(プラグイン)はい(組み込み)
プログレッシブロードはい(プラグインで)はい
フレームワークサイズ~1.2 MB~900 KB
キャッシュメモリ + ディスクメモリ + ディスク
CocoaPodsサポートはいはい

SDWebImageはObjective-Cプロジェクトやハイブリッドプロジェクトで優先されます。KingfisherはタイプセーフティとネイティブなSwift構文により、純粋Swiftプロジェクトにより適しています。両ライブラリのキャッシュアーキテクチャとパフォーマンスは同様です。

iOSプロジェクトでのSDWebImage設定

SDWebImageはSwift Package Manager、CocoaPods、またはCarthageを通じて統合できます。ライブラリはモジュールに分けられています:コア(SDWebImage)、Coder(追加フォーマット)、MapKit(MKAnnotationView用)。

swift
// 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を通じて行います。

swift
// キャッシュのカスタマイズ
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とは何で、どのような問題を解決しますか?

SDWebImageはiOSおよびmacOSでの非同期画像読み込みのためのライブラリです。ネットワークからの画像のキャッシュ、デコード、変換、表示の問題を解決し、開発者から手動のスレッドとメモリ管理を解放します。

UITableViewでSDWebImageを使用する方法は?

cellForRowAtメソッドで、URLとplaceholderを持つsd_setImageを使用します。セルが再利用されたときに、ライブラリが自動的に前回のリクエストをキャンセルします。スムーズなスクロールには、.progressiveLoadオプションを指定し、コンテキストを通じてサムネイルサイズを設定します。

SDWebImageとKingfisherの違いは?

SDWebImageはObjective-Cで書かれ、Swiftラッパーがあります。Kingfisherは純粋Swiftで書かれています。SDWebImageはより広いプラグインエコシステム(WebP、SVG、MapKit)を持ちます。Kingfisherはより良いタイプセーフティとSwift Concurrencyとの統合を提供します。

SDWebImageにWebPサポートを追加する方法は?

CocoaPodsまたはSPMを通じてSDWebImageWebPCoderプラグインをインストールします。AppDelegateでSDImageWebPCoder.sharedを呼び出してコーダーを登録します。登録後、ライブラリが自動的にフォーマットを検出してWebPをデコードします。

SDWebImageキャッシュをプログラマチックに消去する方法は?

メモリはSDImageCache.shared.clearMemory()、ディスクはSDImageCache.shared.clearDisk()を呼び出します。古いファイルだけを消去するには、TTLの確認を伴うclearDisk(completion:)を使用します。calculateSizeWithCompletionBlockメソッドは現在のキャッシュサイズを戻します。

まとめ

  • SDWebImageはGitHubで25,000以上のスターを持つ、iOSにおける画像読み込みのデファクト標準です。
  • 2レベルキャッシュ(メモリ + ディスク)で繰り返し画像の即時読み込みとオフラインアクセスが可能です。
  • プログレッシブロードとGIF、WebP、SVGのサポートにより、どのようなフォーマットに対しても万能のソリューションです。
  • SDWebImageManagerは各コンポーネントをカスタマイズできる、統一された読み込みファザードです。
  • SwiftUI用のWebImageにより、すべての状態を扱いながら宣言的に画像を読み込めます。
  • 変換(サイズ変更、丸み、色)は&&演算子で組み合わせ、キャッシュ前に適用されます。
  • Objective-C互換性により、Swiftへの移行なしでレガシープロジェクトでもSDWebImageを利用できます。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください