AltHanekeSwift 0.22.0

AltHanekeSwift 0.22.0

Tests已测试
Lang语言 SwiftSwift
许可协议 自定义
Released最后发布2019年6月
SPM支持 SPM

Hai Feng Kao 维护。



  • 作者:
  • Hai Feng Kao

Haneke

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 提供了用于 UIImageNSDataJSONString 或任何其他可以读取或写入数据的类型的内存和 LRU 磁盘缓存。

特别地,Haneke 在处理图像方面表现尤为出色。它包括一个零配置的图像缓存,具有自动调整大小功能。所有操作都在后台完成,允许快速、响应式地滚动。让 Haneke 加载、调整大小、缓存和显示 适当大小的图像,就像这样

imageView.hnk_setImageFromURL(url)

真的。

功能

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

对于图像

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

安装

使用 CocoaPods

use_frameworks!
pod 'HanekeSwift'

手动

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

要求

  • iOS 8.0+ 或 tvOS 9.1+
  • 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 本身用作键。

通过使用 格式支持其他类型 或实现 自定义检索器 来进一步自定义。

额外支持图像♡

需要缓存和显示图像吗?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)

检索器

针对 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 可以缓存任何可以读和保存为数据的类型。这是通过实现 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

除非适用法律要求或在书面协议中同意,否则在本许可证下分发的软件按“按原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证中规定的权限和限制的具体语言,请参阅许可证。