1. 程式人生 > >【iOS開發】---- 開源庫SDWebImage

【iOS開發】---- 開源庫SDWebImage

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>

Build Project(編譯工程

       這裡你的工程應該是沒有錯誤的。如果有,去google上找吧。


Future Enhancements(未來增強功能)

       LRU memory cache cleanup instead of reset on memory warning

Future Enhancements