HanekeSwift 0.10.1

HanekeSwift 0.10.1

测试已测试
语言语言 SwiftSwift
许可 自定义
发布上次发布2016年1月
SPM支持 SPM

Hermes Pique 维护。



  • Hermes Pique

Haneke 是一个在 Swift 2.0 中编写的轻量级 通用 缓存,用于 iOS。它设计得非常简单易用。以下是如何初始化 JSON 缓存和从 URL 获取对象的示例

let cache = Cache<JSON>(name: "github")
let URL = NSURL(string: "https://api.github.com/users/haneke")!

cache.fetch(URL: URL).onSuccess { JSON in
    print(JSON.dictionary?["bio"])
}

Haneke 提供了内存和 LRU 磁盘缓存,用于 UIImageNSDataJSONString 或任何可以作为数据进行读写的数据类型。

尤其是,Haneke 在处理图像方面表现出色。它包含一个零配置的图像缓存,具有自动调整大小的功能。所有操作都在后台执行,允许快速响应式滚动。请求 Haneke 加载、调整大小、缓存和显示适合大小的图像就像这样

imageView.hnk_setImageFromURL(url)

真的。

功能

  • 支持 UIImageNSDataJSONString 的开箱即用的通用缓存
  • 使用 NSCache 的第一级内存缓存
  • 使用文件系统的第二级 LRU 磁盘缓存
  • 从网络或磁盘异步获取原始值
  • 所有磁盘访问都在后台执行
  • 线程安全
  • 在内存警告或磁盘容量达到时自动清理缓存
  • 全面的单元测试
  • 通过定义 自定义格式、支持 其他类型 或实现 自定义获取器 来扩展

对于图像

  • 用于缓存并提供配置的 UIImageViewUIButton 扩展,针对 UITableViewUICollectionView 单元格重用进行优化
  • 后台图像调整大小和解压缩

安装

使用 CocoaPods

use_frameworks!
pod 'HanekeSwift'

手动

  1. Haneke.xcodeproj 拖到项目的 项目导航器 中。
  2. 选择您的项目,然后选择您的应用程序目标。打开 构建阶段 面板。
  3. 展开 目标依赖项 组,并添加 Haneke.framework
  4. 点击面板左上角的 + 按钮,并选择 新复制文件阶段。将 目标 设置为 框架,并添加 Haneke.framework
  5. 在需要使用 Haneke 时,使用 import Haneke

要求

  • iOS 8.0+
  • Swift 2.0

使用缓存

Haneke提供了针对UIImageNSDataJSONString的共享缓存。您还可以创建自己的缓存。

缓存是一个键值存储。例如,以下是缓存和获取某些数据的方法。

let cache = Shared.dataCache

cache.set(value: data, key: "funny-games.mp4")

// Eventually...

cache.fetch(key: "funny-games.mp4").onSuccess { data in
    // Do something with data
}

在大多数情况下,值不会立即可用,需要从网络或磁盘获取。Haneke为此提供了一些方便的fetch函数。回到第一个例子,现在使用共享缓存。

let cache = Shared.JSONCache
let URL = NSURL(string: "https://api.github.com/users/haneke")!

cache.fetch(URL: URL).onSuccess { JSON in
   print(JSON.dictionary?["bio"])
}

上述调用将首先尝试从(按顺序)内存、磁盘或NSURLCache中获取所需的JSON。如果不可用,Haneke将从源处获取JSON,然后返回并将其缓存。在这种情况下,URL本身用作键。

可以通过使用格式支持额外类型或实现自定义fetcher来进一步增强自定义。

图像的额外♡功能

需要缓存并显示图像?Haneke为UIImageViewUIButton提供了方便的方法,并对UITableViewUICollectionView单元格的重用进行了优化。图像将被适当地调整大小并在共享缓存中缓存。

// Setting a remote image
imageView.hnk_setImageFromURL(url)

// Setting an image manually. Requires you to provide a key.
imageView.hnk_setImage(image, key: key)

以上代码行负责

  1. 如果已缓存,从内存或磁盘缓存中检索适当大小的图像(基于UIImageViewboundscontentMode)。磁盘访问是在后台进行的。
  2. 如果没有缓存,则在后台从网页/内存中加载原始图像,并产生适当大小的图像。如果可用,将从共享的NSURLCache检索远程图像。
  3. 设置图像并进行适当的情况下的动画变化。
  4. 如果在上面的任何步骤中重新使用了UIImageView,则不执行任何操作。
  5. 缓存生成的图像。
  6. 如果需要,将缓存中最少使用的图像逐出。

格式

格式允许指定磁盘缓存大小和在缓存之前对值的任何转换。例如,UIImageView扩展使用一个格式,该格式将图像调整大小以适应或填满图像视图。

您还可以使用自定义格式。假设您想限制图标的磁盘容量为10MB并应用圆角到图像上。这是它的样子

let cache = Shared.imageCache

let iconFormat = Format<UIImage>(name: "icons", diskCapacity: 10 * 1024 * 1024) { image in
    return imageByRoundingCornersOfImage(image)
}
cache.addFormat(iconFormat)

let URL = NSURL(string: "http://haneke.io/icon.png")!
cache.fetch(URL: URL, formatName: "icons").onSuccess { image in
    // image will be a nice rounded icon
}

因为我们告诉缓存使用"icons"格式,所以Haneke将在后台执行格式转换,并返回结果值。

您还可以从UIKit扩展中使用格式

imageView.hnk_setImageFromURL(url, format: iconFormat)

fetchers

对于url和路径的fetch函数实际上是便利方法。在底层,Haneke使用fetcher对象。为了说明,这里介绍通过显式使用网络fetcher从url获取数据的一种方式。

let URL = NSURL(string: "http://haneke.io/icon.png")!
let fetcher = NetworkFetcher<UIImage>(URL: URL)
cache.fetch(fetcher: fetcher).onSuccess { image in
    // Do something with image
}

从网络或磁盘获取原始值是一个昂贵的操作。fetchers充当值的代理,并允许Haneke仅在绝对必要时才执行获取操作。

在上面的示例中,如果内存或磁盘缓存中没有与"http://haneke.io/icon.png"关联的值,则将执行fetcher。如果发生这种情况,fetcher将负责获取原始值,然后将其缓存以避免进一步的网络活动。

Haneke提供了两个专用fetcher:NetworkFetcher<T>DiskFetcher<T>。您还可以通过从Fetcher<T>派生出自己的fetchers。

自定义fetchers

通过自定义抓取器,你可以从网络或磁盘以外的其他来源(例如 Core Data)获取原始值,甚至可以更改 Haneke 访问网络或磁盘的方式(例如,使用 Alamofire 进行网络连接而不是 NSURLSession)。自定义抓取器必须继承自 Fetcher<T>,并负责

  • 提供要获取的值的相关键(例如,在 NetworkFetcher 的情况下是 NSURL.absoluteString
  • 在后台获取值并相应地调用成功或失败闭包,两者都在主队列中
  • 根据需求取消获取,如果可能的话

抓取器是泛型的,它们类型的唯一限制是必须实现 DataConvertible

支持其他类型

Haneke 可以缓存任何可以被读取和保存为数据的类型。这由实现 DataConvertibleDataRepresentable 协议向 Haneke 表明。

public protocol DataConvertible {
    typealias Result

    class func convertFromData(data:NSData) -> Result?

}

public protocol DataRepresentable {

    func asData() -> NSData!

}

下面就是如何添加对 NSDictionary 的支持

extension NSDictionary : DataConvertible, DataRepresentable {

    public typealias Result = NSDictionary

    public class func convertFromData(data:NSData) -> Result? {
        return NSKeyedUnarchiver.unarchiveObjectWithData(data) as? NSDictionary
    }

    public func asData() -> NSData! {
        return NSKeyedArchiver.archivedDataWithRootObject(self)
    }

}

然后创建一个 NSDictionary 缓存就像这样做

let cache = Cache<NSDictionary>(name: "dictionaries")

路线图

Haneke Swift 处于初期开发阶段,其公共 API 应不被视为稳定。

许可

版权所有 2014 Hermes Pique (@hpique)
                 2014 Joan Romano (@joanromano)
                 2014 Luis Ascorbe (@lascorbe)
                 2014 Oriol Blanc (@oriolblanc)

根据 Apache 许可证协议版本 2.0(“许可证”)许可;除非按照适用法律或书面同意,否则不得使用此文件。您可以在以下位置获得许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件是“按原样”分发的,不提供任何明示或暗示的保证或条件。请参阅许可证了解特定语言的授权和限制。