热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IOS(swift)常见类库使用·SDWebImage使用

Webimage(网络图像)该库提供了一个支持来自Web的远程图像的UIImageView类别它提供了:添加网络图像和缓存管理到CocoaTouchf

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

    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! TableViewCellcell.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 inprintln("成功")
    }

    注意:如果请求被取消,那么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 inprintln("加载中 ")}) { (image:UIImage!, error:NSError!, cacheType:SDImageCacheType, finished:Bool, url:NSURL!) -> Void inif (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 inprintln("缓存中查找到了")})

    默认情况下,如果一个图像不能在内存缓存中找到,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
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

推荐阅读
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
author-avatar
虚伪小仔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有