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

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/shaoting/p/5567486.html
Copyright © 2020-2023  润新知