SwiftImage 是一个用于在 Swift 中下载和缓存图像的框架。它使得从网络获取和缓存图像数据变得容易。它提供:
platform :ios, '8.0'
use_frameworks!
pod 'SwiftImage'
在项目中,您可以导入 SwiftImage 框架
import SwiftImage
从 这里 的源代码。您可以将源代码手动添加到您的项目中。
导入后,UIImageView 现在有了一系列从 URL 中下载图像数据的功能。
使用方法的一个简单示例
let url = NSURL(string: "http://image.com/image.jpg")
var imageView = UIImageView()
imageView.imageWithURL(url!)
使用闭包作为回调
let url = NSURL(string: "http://image.com/image.jpg")
var imageView = UIImageView()
imageView.imageWithURL(url!) { (image, data, error, finished) -> Void in
// Your callback goes here
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.imageView.image = image;
UIView.animateWithDuration(2.0, animations: { () -> Void in
self.imageView.alpha = 1.0
})
})
}
请记住在闭包中切换到主队列以进行 UI 更新。
要取消 ImageView 实例的下载任务,您可以调用 cancelImageDownload()
方法
imageView.cancelImageDownload()
所有功能都可以在 SwiftImageExtension.swift
找到。它们提供了传递闭包并添加进度处理程序和完成处理程序的能力。参数 options: SwiftImageDownloadOption?
用于配置下载和缓存行为。将在下一节中解释。
func imageWithURL(url:NSURL)
func imageWithURL(url:NSURL, placeholderImage: UIImage? = nil, completionHandler:CompletionHandler)
func imageWithURL(url:NSURL, placeholderImage:UIImage? = nil, progressHander:ProgressHandler, completionHandler:CompletionHandler)
func imageWithURL(url:NSURL, options: SwiftImageDownloadOptions?)
func imageWithURL(url:NSURL, options: SwiftImageDownloadOptions?, placeholderImage:UIImage? = nil)
func imageWithURL(url:NSURL, options: SwiftImageDownloadOptions?, placeholderImage:UIImage? = nil, progressHandler:ProgressHandler?)
func imageWithURL(url:NSURL, options:SwiftImageDownloadOptions?, placeholderImage:UIImage? = nil, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:SwiftImageDownloadOptions?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:SwiftImageDownloadOptions?, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:SwiftImageDownloadOptions? = nil, placeholderImage:UIImage? = nil, progressHandler:ProgressHandler? = nil, transformHandler:TransformHandler? = nil, completionHandler:CompletionHandler? = nil)
您可以创建一个 SwiftImagedDownloadOptions 对象并传递前面章节中提到的方...(以下内容省略,因篇幅较长,应根据实际需求进行分段翻译)
1.优先级
负责下载任务队列的优先级。您可以将它指定为DefaultPriority、LowPriority或HighPriority。
2.缓存策略
缓存策略。您可以将它指定为NoCache、MemoryCache、FileCache或MemoryAndFileCache。
3.shouldDecode
指定是否在将图片设置到UI线程的UIImageView之前,在我们后台线程中对图片进行解码的标志。如果全局队列中没有对图片进行解码,UIImageView将会在UI线程中对图片进行解码。如果有太多图片需要解码,这将会阻塞UI线程。默认选项为true。
4.requestCachePolicy
SwiftImage的网络下载部分基于NSURLSession实现。该选项等于NSURLSessionConfiguration类中的requestCachePolicy。您可以指定不同的缓存策略以节省网络带宽并提高您的应用性能。
一个简单的示例
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
}
类似的模式也可以应用于具有UIImageView子视图的UICollectionViewCell子类。
SwiftImage提供了以下两种类型的闭包
public typealias ProgressHandler = ((receivedSize:Int64, expectedSize:Int64)->Void)
public typealias CompletionHandler = ((image:UIImage?, data:NSData?, error:NSError?, finished:Bool)->Void)
ProgressHandler闭包可以用作回调,以跟踪图片下载任务的进度。
CompletionHandler闭包可以在下载操作完成后用作回调。
func imageWithURL(url:NSURL, options:SwiftImagedDownloadOptions?, placeholderImage:UIImage?, progressHandler:ProgressHandler?)
func imageWithURL(url:NSURL, options:SwiftImagedDownloadOptions?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:SwiftImagedDownloadOptions?, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)
func imageWithURL(url:NSURL, options:SwiftImagedDownloadOptions?, placeholderImage:UIImage?, progressHandler:ProgressHandler?, completionHandler:CompletionHandler?)
除了这两种常见场景之外,SwiftImage还定义了一个名为TransformHander的闭包。
public typealias TransformHandler = ((image:UIImage) -> UIImage)
它用于在SwiftImage从互联网下载数据后转换图像。该闭包会在SwiftImage将图像数据存储到内存和磁盘缓存之前应用。它只会在从**互联网**检索图像数据时应用。您可以使用此回调闭包处理从互联网获取的图像数据,而无需在每次从缓存或互联网获取图像数据时都使用CompletionHanlder来处理图像数据。如果需要在获取图像数据后对每个图像进行后处理,这可以大大提高性能。
func imageWithURL(url:NSURL, options:SwiftImageDownloadOptions? = nil, placeholderImage:UIImage? = nil, progressHandler:ProgressHandler? = nil, transformHandler:TransformHandler? = nil, completionHandler:CompletionHandler? = nil)
SwiftImage支持动画GIF,您可以像使用PNG和JPEG图像一样使用它。持有动画图像的UIImageView对象会显示带有动画的GIF。如果您想操纵动画GIF图像中的图像,可以从返回的UIImage实例的images字段中访问。
下载和缓存动画GIF图像
let url = NSURL(string: "https://gifbook.io/assets/video.gif")
imageView.imageWithURL(url!)
您可以使用SwiftImageDownloadManager单例实例来管理图像下载操作。您可以使用它来创建图像下载操作。您可以取消特定的图像下载操作或取消所有操作。
创建图像下载任务
if let operation = SwiftImageDownloadManager.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
}
该函数返回一个SwiftImageDownloadOperation对象。您可以将其传递给SwiftImageDownloadManager单例实例以取消下载操作。
取消图像下载任务
SwiftImageDownloadManager.sharedInstance.cancelOperation(operation)
取消所有现有的图像下载任务
SwiftImageDownloadManager.sharedInstance.cancelAll()
通过创建SwiftImageDownloadOperation实例来创建图像下载任务
let operation = SwiftImageDownloadManager.sharedInstance.retrieveImageFromUrl(url, options: options, completionHandler: { [unowned self](image:UIImage?, data:NSData?, error:NSError?, finished:Bool) -> Void in
// your closure goes here
dispatch_async(dispatch_get_main_queue(), {()->Void in
self.imageView.image = image
})
}
实例创建后,它将立即开始下载。您可以调用start()方法来开始下载任务。
取消SwiftImageDownloadOperation实例的图片下载任务
operation.cancel()
SwiftImage实现了SwiftImageCache单例来异步缓存图像数据。它提供存储/获取从内存缓存或本地文件系统中的图像数据的函数。
func storeImage(image:UIImage, key:String, imageData:NSData? = nil, cachePolicy:SwiftImageCachePolicy, completionHandler:(()-> Void)?)-> Void
func retrieveImageForKey(key: String, options: SwiftImageDownloadOptions, completionHandler: ((UIImage?, CacheType!) -> Void)?) -> Void
func retrieveImageFromMemoryCache(key: String) -> UIImage?
func loadImageDataFromFile(key: String) -> NSData?
存储和检索操作是异步的。您可以将闭包作为completionHandler参数传递作为任务完成的回调。
cachePolicy:SwiftImageCachePolicy
参数用于指定缓存策略。您可以选择在内存缓存、本地文件系统或两者中缓存图像数据。
SwiftImage提供了一系列图像数据处理的函数。这些函数提供了一些常见功能。包括
class func resizeImage(image:UIImage, size:CGSize) -> UIImage
class func getScaledImageSize(image: UIImage, height: CGFloat) -> CGSize
class func getScaledImageSzie(image: UIImage, width: CGFloat) -> CGSize
class func scaleImage(image: UIImage, height: CGFloat) -> UIImage
class func scaleImage(image: UIImage, width: CGFloat) -> UIImage
class func roundImage(image:UIImage, radius:CGFloat) -> UIImage
class func rotatedByDegrees(img: UIImage, degrees: CGFloat) -> UIImage
class func decodImage(image:UIImage) -> UIImage?
class func decodImage(image:UIImage, scale: CGFloat) -> UIImage?
这些方法是类方法。可以从SwiftImageUtils
类直接调用。
所有源代码均使用MIT许可协议。