SwiftImage 1.0.7

SwiftImage 1.0.7

测试测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2016年11月
SPM支持 SPM

Jie Cao 维护。



  • Jie

SwiftImage 中文介绍

SwiftImage 是一个用于在 Swift 中下载和缓存图像的框架。它使得从网络获取和缓存图像数据变得容易。它提供:

  • 一个 ImageView 扩展,允许 UIImageView 从网络下载图像数据并将其缓存到内存缓存和文件系统
  • 一个 SwiftImageDownloadManager 类来创建和管理异步图像下载任务
  • 一个 SwiftImageDownloadOperation 类来异步下载图像
  • 一个 SwiftImageCache 类来在内存缓存和本地文件系统中缓存图像数据
  • 一系列用于缩放、裁剪和解码图像的工具方法
  • 也支持动画 GIF 图像

安装

Podfile

platform :ios, '8.0'
use_frameworks!
pod 'SwiftImage'

在项目中,您可以导入 SwiftImage 框架

import SwiftImage

手动

这里 的源代码。您可以将源代码手动添加到您的项目中。

使用方法

使用 ImageView 扩展

导入后,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 对象设置图像下载和缓存的选项

您可以创建一个 SwiftImagedDownloadOptions 对象并传递前面章节中提到的方...(以下内容省略,因篇幅较长,应根据实际需求进行分段翻译)

1.优先级
负责下载任务队列的优先级。您可以将它指定为DefaultPriority、LowPriority或HighPriority。

2.缓存策略
缓存策略。您可以将它指定为NoCache、MemoryCache、FileCache或MemoryAndFileCache。

3.shouldDecode
指定是否在将图片设置到UI线程的UIImageView之前,在我们后台线程中对图片进行解码的标志。如果全局队列中没有对图片进行解码,UIImageView将会在UI线程中对图片进行解码。如果有太多图片需要解码,这将会阻塞UI线程。默认选项为true。

4.requestCachePolicy
SwiftImage的网络下载部分基于NSURLSession实现。该选项等于NSURLSessionConfiguration类中的requestCachePolicy。您可以指定不同的缓存策略以节省网络带宽并提高您的应用性能。

在UITableViewCell中的使用

一个简单的示例

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)

支持动画GIF

SwiftImage支持动画GIF,您可以像使用PNG和JPEG图像一样使用它。持有动画图像的UIImageView对象会显示带有动画的GIF。如果您想操纵动画GIF图像中的图像,可以从返回的UIImage实例的images字段中访问。

下载和缓存动画GIF图像

    let url = NSURL(string: "https://gifbook.io/assets/video.gif")
    imageView.imageWithURL(url!) 

使用SwiftImageDownloadManager

您可以使用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创建图像下载任务

通过创建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()

使用SwiftImageCache

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实用函数

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许可协议