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 磁盘缓存,用于 UIImage
、NSData
、JSON
、String
或任何可以作为数据进行读写的数据类型。
尤其是,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本身用作键。
可以通过使用格式、支持额外类型或实现自定义fetcher来进一步增强自定义。
需要缓存并显示图像?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使用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。
通过自定义抓取器,你可以从网络或磁盘以外的其他来源(例如 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
除非适用法律要求或书面同意,否则在许可证下分发的软件是“按原样”分发的,不提供任何明示或暗示的保证或条件。请参阅许可证了解特定语言的授权和限制。