1. 程式人生 > >IOS(swift)-常見類庫使用·SDWebImage使用

IOS(swift)-常見類庫使用·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版本

如何使用

swift匯入庫並建立橋接

1、選中專案,右鍵,點選Add Files to xxxx
2、找到SDWebImage.xcodeproj,並加入專案中
3、在Build Phases中的Link Binary With Libraries選項卡中,加入ImageIO.framework、libSDWebImage.a
4、在Build Settings中的Linking選項卡中找到Other Linker Flags,雙擊右邊區域,在彈出的框中點選+按鈕,輸入-ObjC
5、建立專案橋檔案,輸入引用程式碼

#import <SDWebImage/UIImageView+WebCache.h>
Using UIImageView+WebCache category with UITableView

僅需引入UIImageView+WebCache.h 標頭檔案,在UITableViewDataSource的方法tableView:cellForRowAtIndexPath:中呼叫 setImageWithURL:placeholderImage: 方法。從非同步下載到快取管理,一切都會為你處理。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{ let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell cell.detailLabel.text = "\(indexPath.row)" cell.pictureView.sd_setImageWithURL(NSURL(string: "http://www.szplanner.com/images/inside/product_activity_thumb.jpg"), placeholderImage: UIImage(named: "nopic.jpg")) return cell }
Using blocks

使用blocks,你將被告知下載進度,完成時是成功還是失敗:

cell.pictureView.sd_setImageWithURL(NSURL(string: "http://www.szplanner.com/images/inside/product_activity_thumb.jpg"), placeholderImage: UIImage(named: "nopic.jpg")) { (image, error, cacheType, url) -> Void in
    println("成功")
}

注意:如果請求被取消,那麼block不會被呼叫(無論成功還是失敗)。

Using SDWebImageManager

SDWebImageManager 是UIImageView+WebCache 類別中的類。它連結了非同步下載和本地圖片儲存

下面是如何使用SDWebImageManager的程式碼:(有快取機制)

var imageURL:NSURL = NSURL(string: "http://www.szplanner.com/images/inside/product_thumb.jpg")!

SDWebImageManager.sharedManager().downloadImageWithURL(imageURL, options: SDWebImageOptions.allZeros, progress: { (min:Int, max:Int) -> Void in

             println("載入中 ")

      }) { (image:UIImage!, error:NSError!, cacheType:SDImageCacheType, finished:Bool, url:NSURL!) -> Void in

          if (image != nil)
          {
             println("圖片快取完成")
          }
}

也能夠獨立地使用非同步影象下載:(沒有快取機制)

var imageURL:NSURL = NSURL(string: "http://www.szplanner.com/images/inside/product_thumb.jpg")!
SDWebImageDownloader.sharedDownloader().downloadImageWithURL(NSURL(string: imageNetURL), options: SDWebImageDownloaderOptions.allZeros, progress: { (min:Int, max:Int) -> Void in

 }, completed: { (image:UIImage!, data:NSData!, error:NSError!, finished:Bool) -> Void in

 })

為了方便,SDImageCache類提供了一個單例,但是如果你想建立單獨的快取名稱空間你也可以建立新的例項。

你可以使用imageForKey:方法來查詢快取,如果返回為nil,說明當前影象不擁有快取。因此你負責生成並快取它。快取鍵(cache key)是一個程式中影象快取的唯一識別符號,他通常是影象的url。

SDImageCache.sharedImageCache().queryDiskCacheForKey(imageNetURL, done: { (image:UIImage!, cacheType:SDImageCacheType) -> Void in

   println("快取中查詢到了")

})

預設情況下,如果一個影象不能在記憶體快取中找到,SDImageCache將會查詢快取記憶體。你可以呼叫替代的方法imageFromMemoryCacheForKey:來預防這種情況的發生。
儲存一個影象到快取,你可以使用storeImage:forKey: 方法:

SDImageCache.SharedImageCache.StoreImage (image: myImage, key: "myKey");

預設情況下,影象將被儲存在記憶體上的快取以及磁碟上的快取(非同步)。如果你想只在記憶體中快取,使用替代方法storeImage:forKey:toDisk:,第三個引數為負數。

SDImageCache.SharedImageCache.StoreImage (image: myImage, key: "myKey", toDisk: false);

Using cache key filter

有時你也許不想使用影象URL作為快取鍵,因為URL可能是動態的. 下面的示例在應用程式的委託中設定一個過濾器,在使用它的快取鍵之前將從URL中刪除任何查詢字串

public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
    SDWebImageManager.SharedManager.SetCacheKeyFilter (url => {
        var stableUrl = new NSUrl (scheme: url.Scheme, host: url.Host, path: url.Path);  
        return stableUrl.AbsoluteString;
    });
    ...
}

Using dynamic image size with UITableViewCell

Handle image refresh(控制影象重新整理)

預設情況下,SDWebImage確實非常積極的快取。它忽略了所有型別的通過HTTP伺服器返回的快取控制頭,並且沒有時間限制地快取返回的影象。這意味著你的影象url是永遠不會改變的、指向影象的靜態url。如果指向的圖片發生了變化,那麼url也會相應的跟著變化。

如果你不控制你的影象伺服器,當它的內容更新時你不能改變它的url。Facebook頭像就是這種情況的例子。在這種情況下,你可以使用SDWebImageRefreshCached的標誌。這將稍微降低效能,但將會考慮到HTTP快取控制頭:

self.topImageView.sd_setImageWithURL(NSURL(string: imageNetURL), placeholderImage: UIImage(named: "nopic.jpg"), options: SDWebImageOptions.allZeros)

...................................................................................................

//圖片URL
var imageNetURL:String = "http://www.szplanner.com/images/inside/product_thumb.jpg"

//清理快取
SDImageCache.sharedImageCache().clearDisk()

//獲取快取圖片張數
println("快取張數\(SDImageCache.sharedImageCache().getDiskCount())")

//判斷本地快取中是否存在網路中的圖片
println("是否存在\(SDImageCache.sharedImageCache().diskImageExistsWithKey(imageNetURL))")

//直接從快取中提取圖片
self.topImageView.image = SDImageCache.sharedImageCache().imageFromDiskCacheForKey(imageNetURL)

//直接刪除快取中得圖片
SDImageCache.sharedImageCache().removeImageForKey(imageNetURL)



文/_洪小瑤(簡書作者)
原文連結:http://www.jianshu.com/p/d6a2987ebf3e
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。