Tests已测试 | ✓ |
Lang语言 | SwiftSwift |
许可协议 | 自定义 |
Released最后发布 | 2019年6月 |
SPM支持 SPM | ✗ |
由 Hai Feng Kao 维护。
Haneke 是一个轻量级的 泛型 缓存,用于 iOS 和 tvOS,用 Swift 2.0 编写。它设计得非常简单易用。以下是初始化 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 提供了用于 UIImage
、NSData
、JSON
String 或任何其他可以读取或写入数据的类型的内存和 LRU 磁盘缓存。
特别地,Haneke 在处理图像方面表现尤为出色。它包括一个零配置的图像缓存,具有自动调整大小功能。所有操作都在后台完成,允许快速、响应式地滚动。让 Haneke 加载、调整大小、缓存和显示 适当大小的图像,就像这样
imageView.hnk_setImageFromURL(url)
真的。
UIImage
、NSData
、JSON
和 String
的开箱即用支持NSCache
的第一级内存缓存对于图像
UIImageView
和 UIButton
扩展,针对 UITableView
和 UICollectionView
单元格重用进行了优化使用 CocoaPods
use_frameworks!
pod 'HanekeSwift'
手动
Haneke.xcodeproj
拖放到 项目导航器 中的项目中。Haneke.framework
。+
按钮,并选择 新建拷贝文件阶段。设置 目标 为 框架,并添加 Haneke.framework
。import Haneke
。Haneke 提供了用于 UIImage
、NSData
、JSON
和 String
的共享缓存。您还可以创建自己的缓存。
缓存是一种键值存储。例如,以下是缓存和检索一些数据的方式。
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 本身用作键。
通过使用 格式、支持其他类型 或实现 自定义检索器 来进一步自定义。
需要缓存和显示图像吗?Haneke 提供了针对 UIImageView
和 UIButton
的便捷方法,针对 UITableView
和 UICollectionView
单元格复用进行了优化。图像将根据需要调整大小并在共享缓存中进行缓存。
// Setting a remote image
imageView.hnk_setImageFromURL(url)
// Setting an image manually. Requires you to provide a key.
imageView.hnk_setImage(image, key: key)
上面这些行负责
UIImageView
的 bounds
和 contentMode
从内存或磁盘缓存检索适当大小的图像。磁盘访问在后台进行。NSURLCache
中检索。UIImageView
被复用,则不执行任何操作。格式允许指定磁盘缓存大小以及在缓存值之前应用的任何转换。例如,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)
针对 URL 和路径的 fetch
函数实际上是便捷方法。在底层,Haneke 使用了检索器对象。为了说明,以下是另一种使用网络检索器显式从 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
}
从网络或磁盘检索原始值是一项昂贵的操作。检索器作为值的代理,允许 Haneke 仅在必要时执行检索操作。
在上面的示例中,只有当内存或磁盘缓存中没有与 "http://haneke.io/icon.png"
相关的值时,才会执行检索器。如果是这样,检索器将负责检索原始值,然后将其缓存以避免进一步的网络活动。
Haneke 提供了两种专用检索器:NetworkFetcher<T>
和 DiskFetcher<T>
。您还可以通过从 Fetcher<T>
继承来自定义您的检索器。
通过自定义检索器,您可以从除了网络或磁盘以外的其他来源检索原始值(例如,Core Data),甚至可以更改 Haneke 访问网络或磁盘的方式(例如,使用 Alamofire 进行网络操作而不是 NSURLSession
)。自定义检索器必须从 Fetcher<T>
继承,并负责
NetworkFetcher
情况下为 NSURL.absoluteString
)获取器是通用的,对它们类型的唯一限制是它们必须实现 DataConvertible
。
Haneke 可以缓存任何可以读和保存为数据的类型。这是通过实现 DataConvertible
和 DataRepresentable
协议来通知 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
除非适用法律要求或在书面协议中同意,否则在本许可证下分发的软件按“按原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证中规定的权限和限制的具体语言,请参阅许可证。