SDWebImage là một thư viện tải ảnh bất đồng bộ trên iOS và macOS, cung cấp một API thống nhất để làm việc với mạng, bộ nhớ đệm và hoạt ảnh. Theo kho lưu trữ chính thức, thư viện được sử dụng trong hơn 100.000 dự án và hỗ trợ GIF, WebP, SVG và tải dần. SDWebImage cung cấp tự động lưu vào bộ nhớ đệm ổ cứng và bộ nhớ, cũng như tích hợp với UIKit và SwiftUI.
Những điểm chính
SDWebImage là thư viện tải ảnh bất đồng bộ trên các nền tảng Apple (iOS, macOS, tvOS, watchOS). Nó cung cấp một phân loại cho UIImageView với phương thức sd_setImage, tải, lưu vào bộ nhớ đệm và hiển thị ảnh từ bất kỳ nguồn nào chỉ trong một dòng mã.
Thư viện hỗ trợ tải dần (ảnh xuất hiện khi các byte được nhận), ảnh động (GIF, APNG), biến đổi (làm tròn, cắt xén, đóng dấu mờ) và bộ giải mã tùy chỉnh. Theo Thống kê GitHub, SDWebImage có hơn 25.000 sao và được sử dụng trong các ứng dụng lớn, bao gồm Twitter, Pinterest và Instagram.
Kiến trúc được xây dựng trên một chuỗi thành phần: Coder (giải mã), Cache (lưu trữ), Loader (mạng) và Transformer (xử lý). Mỗi thành phần có thể thay thế, cho phép điều chỉnh thư viện theo các yêu cầu cụ thể của dự án.
SDWebImageManager là thành phần trung tâm điều phối quá trình tải. Nó nhận URL, kiểm tra bộ nhớ đệm, tải dữ liệu, giải mã thành UIImage và chuyển nó đến ImageView hoặc Completion Handler. Trình quản lý hoạt động thông qua một singleton dùng chung, có thể truy cập từ bất kỳ đâu trong ứng dụng.
Trình quản lý kiểm tra tuần tự Bộ nhớ đệm (NSDictionary với UIImage), sau đó Bộ nhớ đệm ổ cứng (hệ thống tập tin). Khi không tìm thấy, một yêu cầu mạng được thực hiện qua NSURLSession. Sau khi tải, dữ liệu được giải mã, trải qua các biến đổi và được lưu vào cả hai bộ nhớ đệm. Toàn bộ quá trình chạy trong hàng đợi nền, kết quả được chuyển đến hàng đợi chính.
UIImageView+WebCache là một phân loại Objective-C (có thể truy cập từ Swift) thêm phương thức sd_setImage. Phương thức này chấp nhận URL, placeholder, các tùy chọn (SDWebImageOptions) và một khối hoàn thành. Phân loại tự động hủy yêu cầu trước đó khi ô bảng được tái sử dụng thông qua cơ chế sd_cancelCurrentImageLoad.
Kiến trúc SDWebImage được chia thành nhiều mô-đun với các vùng trách nhiệm rõ ràng. Mỗi lớp giải quyết một nhiệm vụ — từ tải đến hiển thị.
SDWebImageManager là mặt tiền cho tất cả các thao tác ảnh. Nó chứa các tham chiếu đến ImageCache (SDImageCache) và ImageLoader (SDWebImageDownloader). Thông qua ủy quyền SDWebImageManagerDelegate, bạn có thể chặn việc tải và thay đổi URL hoặc hành vi.
SDImageCache là bộ nhớ đệm hai cấp (bộ nhớ + ổ cứng) được khởi tạo với một không gian tên duy nhất. Bộ nhớ đệm lưu UIImage với giới hạn có thể cấu hình (mặc định — cho đến khi cảnh báo bộ nhớ hệ thống). Bộ nhớ đệm ổ cứng lưu dữ liệu trong thư mục Library/Caches với thời gian lưu trữ có thể cấu hình (mặc định 7 ngày).
SDWebImageDownloader là một trình khách HTTP dựa trên NSURLSession với hỗ trợ tiêu đề, thời gian chờ và thử lại. Trình tải xuống loại bỏ trùng lặp các yêu cầu giống nhau thành một lời gọi mạng duy nhất và phân phối kết quả cho tất cả người đăng ký.
SDWebImage triển khai bộ nhớ đệm hai cấp với thứ tự kiểm tra xác định: đầu tiên là bộ nhớ, sau đó là ổ cứng. Khóa bộ nhớ đệm là URL tuyệt đối của ảnh không có tham số truy vấn hoặc băm MD5 của nó.
| Cấp | Loại lưu trữ | Nội dung | Giới hạn |
|---|---|---|---|
| Bộ nhớ đệm | NSCache (NSDictionary) | UIImage (Bitmap đã giải mã) | Đến khi cảnh báo bộ nhớ |
| Bộ nhớ đệm ổ cứng | Hệ thống tập tin | NSData (JPEG/PNG/WebP) | 7 ngày TTL (có thể cấu hình) |
| Bộ nhớ đệm tự động xóa | Bộ nhớ + Ổ cứng | Bộ nhớ đệm kết hợp của framework | Kích thước tệp có thể cấu hình |
Khi nhận được cảnh báo bộ nhớ, iOS thông báo cho SDImageCache qua UIApplicationDidReceiveMemoryWarningNotification, sau đó bộ nhớ đệm được xóa hoàn toàn. Bộ nhớ đệm ổ cứng được xóa theo TTL hoặc khi vượt quá giới hạn, sắp xếp các tệp theo ngày truy cập cuối cùng.
Để quản lý bộ nhớ đệm thủ công, các phương thức sau đây có sẵn: clearMemory, clearDisk, calculateSize. Bộ nhớ đệm có thể bị vô hiệu hóa cho các yêu cầu cụ thể bằng cách sử dụng các tùy chọn SDWebImageCacheMemoryOnly hoặc SDWebImageAvoidAutoSetImage.
SDWebImage cung cấp một số giao diện để tải ảnh: từ phân loại UIImageView đơn giản đến trình quản lý nâng cao với xử lý tùy chỉnh.
sd_setImage là phương thức chính để tải ảnh vào UIImageView. Nó chấp nhận URL, placeholder và các tham số tùy chọn thông qua Options và Context. Tất cả Completion Handler được thực thi trên luồng chính.
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)]
)
Phương thức trả về SDWebImageToken (một thao tác) có thể bị hủy nếu cần. Bên trong, sd_setImage gọi SDWebImageManager.load, chuyển ImageView làm Target để tự động đặt ảnh.
SDWebImage hỗ trợ Transformer — một giao thức với một phương thức duy nhất transformedImage. Các biến đổi tích hợp bao gồm: hình tròn, góc bo tròn, lớp phủ bộ lọc màu và thay đổi kích thước. Các biến đổi có thể được kết hợp bằng toán tử &&.
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]
)
Thư viện cung cấp WebImage — một thành phần View cho SwiftUI với hỗ trợ placeholder, chỉ báo tiến trình và xử lý lỗi. Thành phần tự động đăng ký vào vòng đời View và hủy tải khi nó biến mất.
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 cung cấp một hệ thống biến đổi linh hoạt thông qua giao thức SDImageTransformer. Các biến đổi được áp dụng sau khi giải mã nhưng trước khi lưu vào bộ nhớ đệm — kết quả biến đổi được lưu trên đĩa dưới một khóa mới, ngăn chặn việc áp dụng lại trong các yêu cầu sau đó.
Các biến đổi tích hợp bao gồm: SDImageResizingTransformer (thay đổi kích thước với mode), SDImageRoundCornerTransformer (góc bo tròn với viền tùy chọn), SDImageFlipTransformer (lật ảnh) và SDImageFilterTransformer (bộ lọc CoreImage). Việc kết hợp được thực hiện thông qua toán tử &&, tạo ra một chuỗi xử lý.
Đối với các biến đổi tùy chỉnh, chỉ cần triển khai giao thức SDImageTransformer với phương thức transformedImageWithImage:forKey:. Khóa biến đổi được tự động thêm vào khóa bộ nhớ đệm, ngăn chặn xung đột giữa các phiên bản khác nhau của cùng một ảnh.
Trên nền tảng iOS, các đối thủ cạnh tranh chính của SDWebImage là Kingfisher (Swift thuần túy) và Nuke. Lựa chọn giữa SDWebImage và Kingfisher thường được xác định bởi ngôn ngữ dự án và chức năng yêu cầu.
| Đặc điểm | SDWebImage | Kingfisher |
|---|---|---|
| Ngôn ngữ | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Có (tích hợp) | Có (tích hợp) |
| WebP | Có (plugin) | Có (tích hợp) |
| Tải dần | Có (với plugin) | Có |
| Kích thước framework | ~1.2 MB | ~900 KB |
| Bộ nhớ đệm | Bộ nhớ + Ổ cứng | Bộ nhớ + Ổ cứng |
| Hỗ trợ CocoaPods | Có | Có |
SDWebImage vẫn là lựa chọn ưu tiên cho các dự án Objective-C hoặc dự án kết hợp. Kingfisher phù hợp hơn cho các dự án Swift thuần túy nhờ an toàn kiểu và cú pháp Swift bản địa. Cả hai thư viện đều có kiến trúc bộ nhớ đệm và hiệu suất tương tự.
SDWebImage có thể được tích hợp qua Swift Package Manager, CocoaPods hoặc Carthage. Thư viện được chia thành các mô-đun: lõi (SDWebImage), Coder (định dạng bổ sung) và MapKit (cho MKAnnotationView).
// Trình quản lý gói Swift (Package.swift)
dependencies: [
.package(
url: "https://github.com/SDWebImage/SDWebImage.git",
from: "5.19.0"
)
]
// CocoaPods (Podfile)
pod 'SDWebImage', '~> 5.19.0'
// Plugin cho WebP và SVG:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
Sau khi cài đặt, thư viện đã sẵn sàng sử dụng mà không cần cấu hình thêm. Để tùy chỉnh bộ nhớ đệm, hãy tạo một thể hiện của SDImageCache với không gian tên duy nhất và chuyển nó đến SDWebImageManager trong quá trình khởi tạo. Cấu hình toàn cục được thực hiện thông qua SDWebImageManager.shared.
// Tùy chỉnh bộ nhớ đệm
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 14 ngày thay vì 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
Câu hỏi thường gặp
SDWebImage là thư viện tải ảnh bất đồng bộ trên iOS và macOS. Nó giải quyết các vấn đề về lưu vào bộ nhớ đệm, giải mã, biến đổi và hiển thị ảnh từ mạng, giải phóng nhà phát triển khỏi việc quản lý thủ công luồng và bộ nhớ.
Trong phương thức cellForRowAt, sử dụng sd_setImage với URL và placeholder. Thư viện tự động hủy yêu cầu trước đó khi ô được tái sử dụng. Để cuộn mượt, hãy chỉ định tùy chọn .progressiveLoad và cấu hình kích thước hình thu nhỏ qua ngữ cảnh.
SDWebImage được viết bằng Objective-C với lớp bọc Swift, trong khi Kingfisher được viết bằng Swift thuần túy. SDWebImage có hệ sinh thái plugin rộng hơn (WebP, SVG, MapKit). Kingfisher cung cấp an toàn kiểu tốt hơn và tích hợp Swift Concurrency.
Cài đặt plugin SDWebImageWebPCoder qua CocoaPods hoặc SPM. Đăng ký bộ giải mã bằng cách gọi SDImageWebPCoder.shared trong AppDelegate. Sau khi đăng ký, thư viện tự động phát hiện định dạng và giải mã WebP.
Gọi SDImageCache.shared.clearMemory() cho bộ nhớ và SDImageCache.shared.clearDisk() cho ổ cứng. Để chỉ xóa các tệp cũ, hãy sử dụng clearDisk(completion:) với kiểm tra TTL. Phương thức calculateSizeWithCompletionBlock trả về kích thước bộ nhớ đệm hiện tại.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm