[快速学会Swift第三方库] Kingfisher篇

Kingfisher是一个轻量的下载和缓存网络图片库。下载和缓存是异步进行操作,已经下载好的图片会缓存在内存和本地,极大得提高app的体验。

目录

  • 快速学会Swift第三方库 Kingfisher篇
    • 目录
    • 编码之前
      • 导入 Kingfisher
      • 其他操作
    • 基础操作
    • 使用optionsInfo参数
    • 回调函数
    • 取消任务
    • 下载器
    • 缓存系统
    • 预取
    • 动态图片
    • 深入学习

编码之前

导入 Kingfisher

推荐使用CocoaPods进行导入,CocoaPods是一个负责管理iOS项目中第三方开源库的工具,安装CocoaPods之后使用命令行就能轻松地对所有第三方开源库进行安装和更新,而不需要每次上GitHub去下载。
CocoaPods的安装过程传送门:iOS 9 导入类库全面详尽过程(Ruby安装->CocoaPods安装->导入类库)
手动安装:GitHub-Kingfisher主页

装好CocoaPods后,修改Podfile文件内容为如下:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios,'9.0'
use_frameworks!

target 'Web' do
pod 'Kingfisher','~> 2.4'
end
xcodeproj 'Desktop/Web/Web.xcodeproj'

target后面为工程名,最后一行为工程路径(这里的Web是我的工程名)

再执行命令:

$ pod install

其他操作

另外还需要在Target->工程名->Build Settings->Search Paths->User Header Search Paths处添加Kingfisher所在的目录:

最后在你需要用到Kingfisher的类中加上:

import Kingfisher

基础操作

let url = NSURL(string: "http://www.51work6.com/service/download.PHP?email=scuxiatian@foxmail.com&FileName=test1.jpg")!;

        //打开该URL地址的图片
        imageView.kf_setImageWithURL(url)

        //如果打开失败,打开placeholderImage参数的图片
        imageView.kf_setImageWithURL(url,placeholderImage: UIImage(named: "sps.png"))

        //打开资源中的图片,如果本地缓存中没有,将从URL地址下载,以关键字"MyImage"保存起来,以便下次使用
        let resource = Resource(downloadURL: url,cacheKey: "MyImage");
        imageView.kf_setImageWithResource(resource);

运行效果如下:

使用optionsInfo参数

//强制刷新,无论图片是否已在缓存中,到从URL地址重新下载
        imageView.kf_setimageWithURL(url,placeholderImage: nil,optionsInfo: [.ForceRefresh])

        //自定义关键字为"MyImage"的ImageCache
        let myCache = ImageCache(name: "MyImage");
        //将打开图片存入指定关键字的缓存中,而不是默认缓存
        imageView.kf_setimageWithURL(url,optionsInfo: [.TargetCache(myCache)])

        //图片以淡入方式出现,动画持续1秒
        imageView.kf_setimageWithURL(url,optionsInfo: [.Transition(ImageTransition.Fade(1))])

        //optionsInfo参数可以同时接受多个条件
        imageView.kf_setimageWithURL(url,optionsInfo: [.ForceRefresh,.TargetCache(myCache),.Transition(ImageTransition.Fade(1))])

回调函数

imageView.kf_setimageWithURL(url,optionsInfo: nil,//进度回调函数
        progressBlock: { (receivedSize,totalSize) in
            print(receivedSize / totalSize)
        //完成回调函数
        { (image,error,cacheType,imageURL) in
            print("complete")
        }

取消任务

如果下载的图片不再使用可以停止任务,多用于tableView和collectionview中的cell,当图片还没下载完成时,用户就滑动界面导致cell消失的情况。

imageView.kf_setimageWithURL(url)
        //停止图片的取回
        imageView.kf_cancelDownloadTask();

也可以利用kf_setimageWithURL函数的返回值(类型为RetrieveImageTask)来进行更多的管理操作

let task = imageView.kf_setimageWithURL(url)
        //取消任务
        task.cancel();

下载器

自定义下载器参数

//获取下载器
        let downloader = KingfisherManager.sharedManager.downloader
        //设置超时时间,默认为15妙
        downloader.downloadTimeout = 5
        //requestModifier中的内容会在下载之前开始执行
        downloader.requestModifier = {
            (request: NSMutableuRLRequest) in
            self.imageView.image = UIImage(named: "sps.png")
        }
        //设置信任host
        downloader.trustedHosts = Set(["httpbin.org"])

缓存系统

自定义缓存参数

//获取缓存
        let cache = KingfisherManager.sharedManager.cache
        //设置最大磁盘缓存为50Mb,默认为无限制
        cache.maxdiskCacheSize = 50 * 1024 * 1024
        //设置最大缓存时间为1天,默认为1周
        cache.maxCachePeriodInSecond = 60 * 60 * 24
        //计算缓存占用的磁盘大小
        cache.calculatediskCacheSizeWithCompletionHandler { (size) in
            print(size)
        }
        //清空存储器缓存
        cache.clearMemoryCache()
        //清空磁盘缓存
        cache.cleardiskCache()
        //清空失效和过大的缓存
        cache.cleanExpireddiskCache()

预取

将一些图片在显示到屏幕上之前,先预取到缓存。主要用于当你可以预知接下来会用到图片资源时,避免多次请求。

let urlString1 = "http://www.51work6.com/service/download.PHP?email=scuxiatian@foxmail.com&FileName=test1.jpg"
        let urlString2 = "http://www.51work6.com/service/download.PHP?email=scuxiatian@foxmail.com&FileName=test2.jpg"

        let urls = [urlString1,urlString2].map{NSURL(string: $0 )!}
        let prefetcher = ImagePrefetcher(urls: urls,progressBlock: nil) { (skippedResources,FailedResources,completedResources) in
            print("These resources are prefetched:\(completedResources)")
        }
        //开始预取,预取成功的图片处理方式跟ImageCache中缓存的图片一样
        prefetcher.start()
        //停止预取
        prefetcher.stop()

动态图片

加载动态图片只需要加上一行代码,设置imageView为AnimatedImageView,不设置也能加载,但是在动态图片较大的时候推荐进行该设置。

imageView = AnimatedImageView()
        imageView.kf_setImageWithURL(url)

深入学习

这里列出了Kingfisher大多数操作,如果想要深入学习Kingfisher,可以前往GitHub-Kingfisher主页!

[快速学会Swift第三方库] Kingfisher篇的更多相关文章

  1. 详解使用双缓存解决Canvas clearRect引起的闪屏问题

    这篇文章主要介绍了详解使用双缓存解决Canvas clearRect引起的闪屏问题的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解使用postMessage解决iframe跨域通信问题

    这篇文章主要介绍了详解使用postMessage解决iframe跨域通信问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  6. 在iOS上,缓存绘制的屏幕图像并显示它的最快方法是什么?

    我没有让drawRect每次重绘数千个点,我认为有几种方法可以“在屏幕上缓存图像”和任何其他绘图,我们将添加到该图像,并在drawRect时显示该图像:>使用BitmapContext并绘制到位图,并在drawRect中绘制此位图.>使用CGLayer并在drawRect中绘制CGLayer,这可能比方法1快,因为此图像缓存在图形卡中(并且它不会计入iOS上“内存警告”的RAM使用情况?

  7. cocoapods – 命令/ bin / sh失败,退出代码23

    适用于所有豆荚,无需豆荚但仍然是同样的错误.有任何想法吗?

  8. ios – NSURLCache和数据保护

    我正在尝试保护存储在NSURLCache中的敏感数据.我的应用程序文件和CoreDatasqlite文件设置为NSFileProtectionComplete.但是,我无法将NSURLCache文件数据保护级别更改为NSFileProtectionCompleteUntilFirstUserAuthentication以外的任何其他级别.这会在设备锁定时暴露缓存中的任何敏感数据.我需要缓存响应,以

  9. iOS编译库/框架链接器标记问题是设备编译而不是模拟器

    背景:我正在尝试使用带有cocoapods的Phonegap.Phonegap已经存在从命令行编译的问题所以我只是将Xcode与生成的项目文件一起使用(并且在使用cocoapods时我无论如何都必须这样做).我用我的问题向Github推送了一个复制的空项目:https://github.com/Dan2552/phonegap-reproducable-issue您可以在repo的根目录中的bui

  10. ios – CocoaPods CorePlot安装显示缺少的框架和丢失的文件

    我是CocoaPods的新手,我正在尝试在我的Podfile中使用此行安装CorePlot:当我在安装后打开.xcworkspace文件时,CorePlot会显示缺少的框架.我将这些链接的二进制文件安装到我的Xcode项目中,但这并没有解决问题.在CorePlot目标中,似乎没有单独的方法来安装框架.这不是唯一的问题.当我尝试在CorePlot库中引用文件时,即使我可以看到CorePlot目标中的文件,我也会收到文件未找到错误:我尝试了以下import语句:都导致同样的错误.我不知道这些问题是否相关.我应

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部