zoukankan      html  css  js  c++  java
  • 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版本

    • 如何使用

      API 文档地址 http://hackemist.com/SDWebImage/doc/

      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

      UITableView通过第一个单元格设置的图像决定图像的尺寸。如果您的远程图像没有图像占位符的大小相同,您可能会遇到奇怪的变形缩放问题。下面的文章给出了一个方法来解决这个问题:
      http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/

      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    文/_洪小瑶(简书作者)

  • 相关阅读:
    Swift
    Swift
    UVa
    Go如何发送广播包
    人迹罕至的android要完全退出程序的一种方法
    备注ocp_ORACLE专题网络
    JS它DOM
    HDU 1693 Eat the Trees 插头DP
    ubuntu-14.04 系统安装mysql-5.6.21
    1941设置站点模板,一生珍藏,所有玩具
  • 原文地址:https://www.cnblogs.com/shaoting/p/5567486.html
Copyright © 2011-2022 走看看