CJImageUtils 1.0.7

CJImageUtils 1.0.7

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布日期最新发布2015年11月
SPM支持 SPM

Cao Jie维护。



  • 作者
  • Jie

CJImageUtils

CJImageUtils是一个轻量级的从网络下载图像并进行缓存的库。整个库基于Swift实现,并受到SDWebImage的启发。CJImageUtils提供了对Swift的原生支持,不需要额外的配置即可在基于Objective-C的库中运行。整个库包含了从网络获取图像并进行缓存的一系列功能和接口。具体包括:

  • 一个UIImageView extension来提供从网络异步下载图像并缓存的接口
  • CJImageFetchManager来创建和管理图像异步下载的任务
  • CJImageFetchOperation提供图像异步网络下载的接口
  • CJImageCache提供在内存和文件存储中缓存图片的接口
  • 一系列图像处理的工具集用于图像的缩放,剪切和在后台解压缩

安装

Podfile

platform :ios, '8.0'
pod 'CJImageUtils'

直接嵌入源代码

CJImageUtils是一个开源库,可以从这里直接找到源代码并添加到项目中

如何使用

使用 ImageView Extension

导入CJImageUtils库后,UIImageView提供了从NSURL异步下载图像并缓存的多达几种接口。一个简单的例子:

let url = NSURL(string: "http://image.com/image.jpg")
var imageView = UIImageView()
imageView.imageWithURL(url!)

所有接口可以在CJImageViewExtension文件中找到。

func imageWithURL(url:NSURL)
func imageWithURL(url:NSURL, options: CJImageFetchOptions?)
func imageWithURL(url:NSURL, options: CJImageFetchOptions?, placeholderImage:UIImage?)
func imageWithURL(url:NSURL, options: CJImageFetchOptions?, placeholderImage:UIImage?, progressHandler:ProgressHandler?)
func imageWithURL(url:NSURL, options:CJImageFetchOptions?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:CJImageFetchOptions?, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:CJImageFetchOptions?, placeholderImage:UIImage?, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)

通过 CJImageFetchOpetions 设置下载和缓存选项

在下载图像时,可以通过创建一个 CJImageFetchOptions 来对下载和缓存的各个环节进行设置。可以设置的选项包括
1.priority
负责图像下载队列的优先级。可以设置为 DefaultPriority,LowPriority 和 HighPriority。
2.cachePolicy
设置图像存储策略。可以设置为 NoCache,MemoryCache,FileCache 和 MemoryAndFileCache。分别对应不缓存,只缓存于内存,只缓存于文件系统和在内存和文件系统中同时缓存。
3.shouldDecode
图像是否需要解压缩。在图像从网络下载后,UIImageView需要对图像进行解压缩才能显示。这个过程通常是隐式的,并且会发生在UI主线程。可以通过开启这个选项来使图像在后台队列解压缩,从而不会阻塞UI主线程。
4.requestCachePolicy
CJImageUtils的图像下载是基于NSURLSession实现的。此选项对应于NSURLSessionConfiguration的 requestCachePolicy 选项。可以通过设置此选项来设置下载时session的缓存策略。

UITableView使用的例子

UITableViewCell中的ImageView可以直接使用CJImageViewExtion提供的函数。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
         // get the data ojbect for the indexPath
        let data = self.dataSource[indexPath.row] as! [String :String]        
        let cell = self.tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ImageTableViewCell
        cell.contentLabel?.text = data["text"]
        let placeholderImage = UIImage(named: "placeholder.jpg")
        // get image URL
        if let imageUrl = NSURL(string: data["url"]!){
            cell.photoView?.imageWithURL(imageUrl, options: nil, placeholderImage: placeholderImage)
            cell.photoView?.contentMode = .ScaleAspectFit
        }
        return cell
    }

CollectionsViewCell也可以用类似的方法。

使用 Closure

CJImageUtils定义以下两个Closure来提供下载图像过程中的和完成后的回调

public typealias ProgressHandler = ((receivedSize:Int64, expectedSize:Int64)->Void)
public typealias CompletionHandler = ((image:UIImage?, data:NSData?, error:NSError?, finished:Bool)->Void)

在CJImageViewExtension中,以下函数可以使用Closure

func imageWithURL(url:NSURL, options:CJImageFetchOptions?, placeholderImage:UIImage?, progressHandler:ProgressHandler?)
func imageWithURL(url:NSURL, options:CJImageFetchOptions?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:CJImageFetchOptions?, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:CJImageFetchOptions?,placeholderImage:UIImage?, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)

使用 CJImageFetchManager

有时下载完图像后,不需要直接传递给UIImageView显示,并需要对下载图像的任务进行管理。CJImageUtils提供了CJImageFetchManager单例来创建和管理图像异步下载并缓存的任务。

func retrieveImageFromUrl(url:NSURL, options:CJImageFetchOptions? = nil, completionHandler:((image:UIImage?, data:NSData?, error:NSError?, finished:Bool)->Void)?, progressHandler:((receivedSize:Int64, expectedSize:Int64)->Void)?) -> CJImageFetchOperation?

此函数会返回一个 CJImageOperation 的实例。你可以保持一个实例,从而适当地管理一个下载任务,例如在某些情况下取消下载。
创建一个图像异步下载任务

if let operation = CJImageFetchManager.sharedInstance.retrieveImageFromUrl(url, options: options, completionHandler:{(image:UIImage?, data:NSData?, error:NSError?,finished:Bool) -> in
    // your completion handler
},
progressHandler: {(receivedSize:Int64, expectedSize:Int64) in
    // your progress handler
}) {
    // save the operation for future management
}

取消一个图像下载任务

CJImageFetchManager.sharedInstance.cancelOperation(operation)

这里的Operation就是之前创建下载任务时得到的 CJImageOperation 实例

使用 CJImageFetchOperation 创建图像下载缓存任务

CJImageUtils提供一个 CJImageFetchOperation 作为图像下载缓存的任务。你可以直接创建 CJImageFetchOperation 的实例来创建图像下载和缓存的任务。

init(url:NSURL, options:CJImageFetchOptions, progressHandler:((receivedSize:Int64, expectedSize:Int64)->Void)?, completionHandler:((image:UIImage?, data:NSData?, error:NSError?, finished:Bool)->Void)?)

任务创建后不会立即开始下载。你需要调用 start() 来手动开始任务下载。

使用 CJImageCache

CJImageUtils实现了一个 CJImageCache 的单例来异步缓存图像。该实例提供一系列函数,实现图像在内存或文件系统中存储和读取。

func storeImage(image:UIImage, key:String, imageData:NSData? = nil, cachePolicy:CJImageCachePolicy, completionHandler:(()-> Void)?)-> Void
func retrieveImageForKey(key: String, options:CJImageFetchOptions, completionHandler: ((UIImage?, CacheType!) -> Void)?) -> Void    
func retrieveImageFromMemoryCache(key: String) -> UIImage?
func loadImageDataFromFile(key: String) -> NSData?    

其中,在文件系统中存取图像信息是异步的,通过传递 closure 来实现回调。

使用CJImageUtils的工具集

CJImageUtils提供了一些图像处理常用的函数。包括:

  1. 图像缩放
    class func resizeImage(image:UIImage, size:CGSize) -> UIImage   
  1. 根据图像缩放到指定宽高后对应的高或者宽(保持宽高比)
    class func scaleImage(image: UIImage, height: CGFloat) -> CGSize
    class func scaleImage(image: UIImage, width: CGFloat) -> CGSize
  1. 剪切图像成圆形图像
    class func roundImage(image:UIImage, radius:CGFloat) -> UIImage
  1. 将图像旋转指定角度
    class func rotatedByDegrees(img: UIImage, degrees: CGFloat) -> UIImage
  1. 图像解压缩 该函数的具体作用在前面已经介绍过。这里指列出函数的形式:
    class func decodImage(image:UIImage) -> UIImage?
    class func decodImage(image:UIImage, scale: CGFloat) -> UIImage? 

这些函数都是class function,可以直接用CJImageUtils的class调用。

许可协议

所有源代码均在MIT许可协议下。