【iOS開發】---- 開源庫SDWebImage
阿新 • • 發佈:2019-02-09
Web image(網路影象)
該庫提供了一個支援來自Web的遠端影象的UIImageView類別
它提供了:
- 新增網路影象和快取管理到Cocoa Touch framework的UIImageView類別
- 非同步影象下載
- An asynchronous memory + disk image caching with automatic cache expiration handling
- 支援GIF動畫
- 支援WebP格式
- 後臺影象解壓
- 保證相同的url不會下載多次
- 保證偽造的URL不會嘗試一遍又一遍的下載
- 保證主執行緒永遠不會被阻塞
- Performances!
- 使用GCD和ARC
注意:SDWebImage 3.0不向後相容2.0並且最低需要iOS 5.0 的版本。如果你的iOS版本低於5.0,請使用 2.0版本。
如何使用
Using UIImageView+WebCache category with UITableView
僅需引入 UIImageView+WebCache.h 標頭檔案,在UITableViewDataSource的方法tableView:cellForRowAtIndexPath:中呼叫setImageWithURL:placeholderImage:方法。從非同步下載到快取管理,一切都會為你處理。#import <SDWebImage/UIImageView+WebCache.h> ... - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *MyIdentifier = @"MyIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; } // Here we use the new provided setImageWithURL: method to load the web image [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; cell.textLabel.text = @"My Text"; return cell; }
Using blocks 使用blocks,你將被告知下載進度,完成時是成功還是失敗:
// Here we use the new provided setImageWithURL: method to load the web image [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {... completion code here ...}];
注意:如果請求被取消,那麼block不會被呼叫(無論成功還是失敗)。
Using SDWebImageManager
The SDWebImageManager is the class behind the UIImageView+WebCache category. It ties the asynchronous downloader with the image cache store. You can use this class directly to benefit from web image downloading with caching in another context than a UIView (ie: with Cocoa) 下面是如何使用SDWebImageManager的程式碼:SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager downloadWithURL:imageURL options:0 progress:^(NSUInteger receivedSize, long long expectedSize) { // progression tracking code } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { if (image) { // do something with image } }];
Using Asynchronous Image Downloader Independently 也能夠獨立地使用非同步影象下載:
[SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL options:0 progress:^(NSUInteger receivedSize, long long expectedSize) { // progression tracking code } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { if (image && finished) { // do something with image } }];
Using Asynchronous Image Caching Independently 也可以獨立地使用基於非同步的影象快取儲存。SDImageCache維護一個記憶體快取和一個可選的磁碟快取。磁碟高 速快取的寫操作是非同步進行的,所以它不會給UI增加不必要的延遲 。 為了方便,SDImageCache類提供了一個單例,但是如果你想建立單獨的快取名稱空間你也可以建立新的例項。
你可以使用imageForKey:方法來查詢快取,如果返回為nil,說明當前影象不擁有快取。因此你負責生成並快取它。快取鍵(cache key)是一個程式中影象快取的唯一識別符號,他通常是影象的url。
SDImageCache *imageCache = [SDImageCache.alloc initWithNamespace:@"myNamespace"]; [imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { // image is not nil if image was found }];
預設情況下,如果一個影象不能在記憶體快取中找到,SDImageCache將會查詢快取記憶體。你可以呼叫替代的方法imageFromMemoryCacheForKey:來預防這種情況的發生。 儲存一個影象到快取,你可以使用storeImage:forKey: 方法:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
預設情況下,影象將被儲存在記憶體上的快取以及磁碟上的快取(非同步)。如果你想只在記憶體中快取,使用替代方法storeImage:forKey:toDisk:,第三個引數為負數。
Using cache key filter
有時你也許不想使用影象URL作為快取鍵,因為URL可能是動態的(i.e.: for access control purpose)。SDWebImageManager provides a way to set a cache key filter that takes the NSURL as input, and output a cache key NSString(這句不大理解)。下面的示例在應用程式的委託中設定一個過濾器,在使用它的快取鍵之前將從URL中刪除任何查詢字串(The following example sets a filter in the application delegate that will remove any query-string from the URL before to use it as a cache key):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { SDWebImageManager.sharedManager.cacheKeyFilter:^(NSURL *url) { url = [[[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path] autorelease]; return [url absoluteString]; }; // Your app init code... return YES; }
Using dynamic image size with UITableViewCell
UITableView通過第一個單元格設定的影象決定影象的尺寸。如果您的遠端影象沒有影象佔位符的大小相同,您可能會遇到奇怪的變形縮放問題。下面的文章給出了一個方法來解決這個問題:Handle image refresh(控制影象重新整理)
預設情況下,SDWebImage確實非常積極的快取。它忽略了所有型別的通過HTTP伺服器返回的快取控制頭,並 且沒有時間限制地快取返回的影象。這意味著你的影象url是永遠不會改變的、指向影象的靜態url。如果指向的圖片 發生了變化,那麼url也會相應的跟著變化。如果你不控制你的影象伺服器,當它的內容更新時你不能改變它的url。Facebook頭像就是這種情況的例子。在這種情況下,你可以使用SDWebImageRefreshCached的標誌。這將稍微降低效能,但將會考慮到HTTP快取控制頭:
[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] options:SDWebImageRefreshCached];
Add a progress indicator(新增進度指示)
Installation(安裝)
有兩種方式使用SDWebImage: 1.將檔案全部拖入工程中; 2.將工程作為一個靜態庫拖入工程中。Add the SDWebImage project to your project
- Download and unzip the last version of the framework from the download page
- Right-click on the project navigator and select "Add Files to "Your Project":
- In the dialog, select SDWebImage.framework:
- Check the "Copy items into destination group's folder (if needed)" checkbox
Add dependencies(新增依賴性)
- In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block:
- Click the "+" button again and select the "ImageIO.framework"(還缺一個“MapKit.framework”,readme中沒提到), this is needed by the progressive download feature:
Add Linker Flag(新增連結標誌)
Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag:
Import headers in your source files(匯入標頭檔案到你的資原始檔中)
在你需要用到這個庫的資原始檔中匯入下面的標頭檔案:#import <SDWebImage/UIImageView+WebCache.h>