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のアーキテクチャは明確な責任範囲を持つ複数のモジュールに分かれています。各クラスは読み込みから表示までの1つの任務を解決します。
SDWebImageManagerはすべての画像操作のファザードです。ImageCache(SDImageCache)およびImageLoader(SDWebImageDownloader)への参照を保持しています。SDWebImageManagerDelegateを通じて、読み込みを拦戮してURLや動作を変更できます。
SDImageCacheは2レベルキャッシュ(メモリ + ディスク)で、固有のネームスペースで初期化されます。メモリキャッシュは設定可能な制限付きでUIImageを保存します(デフォルトではシステムメモリ警告まで)。ディスクキャッシュはLibrary/Cachesディレクトリに、設定可能な保存期間(デフォルト7日)でデータを保存します。
SDWebImageDownloaderはNSURLSessionベースのHTTPクライアントで、ヘッダー、タイムアウト、再試行をサポートしています。ダウンローダーは同じリクエストを1つのネットワークコールに重複解除し、結果をすべてのサブスクライバーに分配します。
SDWebImageは決定的な確認順序で2レベルのキャッシュを実装しています:最初にメモリ、その後にディスクです。キャッシュキーは、クエリパラメータのない絶対画像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—placeholder、進行状況インジケータ、エラー処理をサポートするSwiftUI用のビューコンポーネントを提供しています。このコンポーネントは自動的にビューのライフサイクルにサブスクライブし、消失時に読み込みをキャンセルします。
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(オプションの置きます
カスタム変換には、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アプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。