[翻译] Haneke(处理图片缓存问题)

Haneke

https://github.com/hpique/Haneke

A lightweight zero-config image cache for iOS.

轻量级0配置图片缓存。

Haneke resizes images and caches the result on memory and disk. Everything is done in background, allowing for fast, responsive scrolling. Asking Haneke to load, resize, cache and display an appropriately sized image is as simple as:

Haneke 重新设置图片尺寸并将图片缓存到内存和磁盘上。所有这些事都是在后台完成的,为了快速而流畅的 scrolling 。调用如此简单:

[imageView hnk_setImageFromURL:url];

Really.

真的。

Features(特性

  • First-level memory cache using NSCache.
  • Second-level LRU disk cache using the file system.
  • Zero-config UIImageView category to use the cache, optimized for UITableView and UICollectionViewcell reuse.
  • Asynchronous and synchronous image retrieval.
  • Background image resizing and file reading.
  • Image decompression.
  • Custom image transformations before and after resizing.
  • Thread-safe.
  • Automatic cache eviction on memory warnings or disk capacity reached.
  • Preloading images from the disk cache into memory on startup.
  • NSCache 第一级别的缓存
  • 第二级别的文件系统缓存
  • 0配置的 UIImageView 类目来使用缓存,对 UITableView 以及 UICollectionViewCell 重用进行优化
  • 异步以及同步的图片恢复技术
  • 在后台进行图片尺寸的设置以及文件读写
  • 图片解压缩
  • 在重新设置图片尺寸之间可以自定义图片的变换形式
  • 线程安全
  • 自动清除内存警告或者磁盘容量溢出
  • 在内存启用的时候就已经从磁盘上预加载了图片

Add Haneke to your project(添加到你的工程当中

  1. Add the Haneke folder to your project.
  2. Profit!
  3. 将 Haneke 文件夹添加到你的工程当中。
  4. 尽情享用吧!

UIImageView category(UIImageView 类目

Haneke provides convenience methods for UIImageView with optimizations for UITableView and UICollectionView cell reuse. Images will be resized appropriately and cached in a shared cache.

Haneke 给 UIImageView 提供了便利的方法,用来给 UITableView 以及 UICollectionVIew 进行重用。图片会被适当的重新设置尺寸并缓存到单例缓存当中。

// Setting a remote image
[imageView hnk_setImageFromURL:url];// Setting a local image
[imageView hnk_setImageFromFile:path];// Setting an image manually. Requires you to provide a key.
[imageView hnk_setImage:image withKey:key];

The above lines take care of:

上面的代码需要注意:

  1. If cached, retrieving an appropriately sized image (based on the bounds and contentMode of the UIImageView) from the memory or disk cache. Disk access is performed in background.
  2. If not cached, loading the original image from web/disk/memory and producing an appropriately sized image, both in background. Remote images will be retrieved from the shared NSURLCache if available.
  3. Setting the image and animating the change if appropriate.
  4. Or doing nothing if the UIImageView was reused during any of the above steps.
  5. Caching the resulting image.
  6. If needed, evicting the least recently used images in the cache.
  7. 如果已经缓存了,就会从内存或者磁盘缓存文件中恢复出设置过尺寸的图片(基于 bounds 以及 UIIamgeView 的 contentMode)。磁盘操作都在后台进行。
  8. 如果还没有进行缓存,从web/磁盘/内存中加载原始的图片并创建出便利的图片尺寸,都是在后台进行的。web上的图片将会被恢复加载,在这个当你NSURLCache中,如果存在的话。
  9. 如果便利则会设置图片以及动态改变。
  10. 如果重用了,上面的都不是执行。
  11. 缓存重用的图片。
  12. 如果有需求,移除掉缓存中使用最少的图片。

Cache formats(缓存格式

The cache behavior can be customized by defining cache formats. Each image view has a default format and you can also define your own formats. A format is uniquely identified by its name.

你是可以定制缓存的行为的。每张图片View都有一个默认的格式,你也可以自定义你自己的格式,每种格式都有它自己的唯一标示的名字。

UIImageView format(UIImageView 的格式

Each image view has a default format created on demand. The default format is configured as follows:

每个 iamgeView 有一个默认的格式,这个默认的格式是这么被配置的:

  • Size matches the bounds of the image view.
  • Images will be scaled based on the contentMode of the the image view.
  • Images can be upscaled if they're smaller than the image view.
  • High compression quality.
  • No preloading.
  • Up to 10MB of disk cache.

Modifying this default format is discouraged. Instead, you can set your own custom format like this:

不要修改默认的图片格式。相对的,你可以设置你自己的图片格式:

HNKCacheFormat *format = [[HNKCacheFormat alloc] initWithName:@"thumbnail"];
format.size = CGSizeMake(320, 240);
format.scaleMode = HNKScaleModeAspectFill;
format.compressionQuality = 0.5;
format.diskCapacity = 1 * 1024 * 1024; // 1MB
format.preloadPolicy = HNKPreloadPolicyLastSession;
imageView.hnk_cacheFormat = format;

The image view category will take care of registering the format in the shared cache.

iamge view 的类目会注册这个格式到 cache 的单例中。

Disk cache(磁盘缓存

A format can have disk cache by setting the diskCapacity property with a value greater than 0. Haneke will take care of evicting the least recently used images of the format from the disk cache when the disk capacity is surpassed.

磁盘缓存 diskCapacity 是可以设置的。Haneke 会自动移除掉使用得最少的 image,当往这个已经满了的磁盘缓存中写入新的图片。

Preload policy(预加载策略

When registering a format, Haneke will load none, some or all images cached on disk into the memory cache based on the preload policy of the format. The available preload policies are:

当注册了一种格式后,Haneke会将磁盘上缓存的图片加载到内存的缓存当中,基于这个预加载的策略。提供给你的预加载策略如下:

  • HNKPreloadPolicyNone: No images will be preloaded.
  • HNKPreloadPolicyLastSession: Only images from the last session will be preloaded.
  • HNKPreloadPolicyAll: All images will be preloaded.

If an image of the corresponding format is requested before preloading finishes, Haneke will cancel preloading to give priority to the request. To make the most of this feature it's recommended to register formats on startup.

如果此时有一张图片开始请求了,在预加载完成之前发生的,Haneke 会取消预加载而响应这个请求。为了最大限度的使用这个特性,建议你在程序开始运行的时候就开始注册。

Preloading only applies to formats that have disk cache.

预加载仅支持能够进行磁盘缓存的格式。

Pre and post resize blocks

Formats can have blocks that will be called before and after the original image is resized: preResizeBlock and postResizeBlock respectively. Both receive a key and the image up to the corresponding stage. For example:

format.postResizeBlock = ^UIImage* (NSString *key, UIImage *image) {UIImage *roundedImage = [image imageByRoundingCorners];return roundedImage;
};

These blocks will be called only if the requested image is not found in the cache. They will be executed in background when using the image view category or the asynchronous methods of the cache directly.

Logging(debug

Haneke provides useful logging that is turned off by default. You can see it in action in the demo.

Haneke 提供好用的打印信息,默认是关闭了的。你可以在demo中看到效果。

To turn logging on you must set the preprocessor macro HANEKE_DEBUG to 1. The recommended way to do this is by adding HANEKE_DEBUG=1 to the Preprocessor Macros build setting. If you included Haneke directly, add it to your project target. If you are using CocoaPods, add it to the Pods-Haneke target of the Pods project.

你把预处理宏 HANEKE_DEBUG 设置成1就可以看到打印信息了。

Requirements(环境要求

Haneke requires iOS 7.0 or above and ARC.

iOS 6 compatibility can be achieved with very few changes. You can use @shkutkov's fork that adds it by replacing NSURLSession with AFNetworking.

Haneke 需要 iOS 7.0 以及 ARC。

虽然兼容 iOS 6,但基本上没有啥效果,你可以使用  @shkutkov's fork 来替换 AFNetworking 中的 NSURLSession 。

Roadmap(任重而道远

Haneke is in initial development and its public API should not be considered stable.

Haneke 是一个刚刚开始的项目,所以,它公开的 API 可能会经常变动。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题:为什么Java中的字符串对象是不可变的

阅读本文大概需要 4分钟。所谓不可变对象,是指一个对象在创建后,它的内部状态不会被改变的对象。这意味着当我们将一个不可变对象的引用赋值给某个变量后,我们就不能改变该对象的内部状态。 James Gosling也说过——Java开发者应该尽量使用不…

复现STGCN CPU版 (ubuntu16.04+pytorch0.4.0+openpose+caffe)

前提:ubuntu下将python3.5.2设为默认(百度) 一.下载stgcn (gitbub上fork后导入到gitee快些): st-gcn: Spatial Temporal Graph Convolutional Networks (ST-GCN) for Skeleton-Based Action Recognition in PyTorch…

Linux Shell编程之输入输出重定向

一、.输出重定向: 1.以覆盖方式把正确输入和错误输入都保存在同一个文件中 命令 &> 文件 2.以追加方式把正确输入和错误输入都保存在同一个文件中 命令 &>> 文件 3.以追加方式把正确输入保存在文件1中,把错误输入保存在文件2中 命令 …

不止JDK7的HashMap,JDK8的ConcurrentHashMap也会造成CPU 100%

大家可能都听过JDK7中的HashMap在多线程环境下可能造成CPU 100%的现象,这个由于在扩容的时候put时产生了死链,由此会在get时造成了CPU 100%。这个问题在JDK8中的HashMap获得了解决。其实JDK7中的HashMap在多线程环境下不止只有CPU 100%这一共怪异现象&am…

关于发布DIPS的MVC项目的IIS 7.0环境配置的方法

本人技术笨拙,今天在发布DIPS的MVC4.0项目,并部署到IIS上,遇到各种问题。在查询相关资料后,最终得以解决,所以想把这个过程记录下来。 注:DIPS为一种非关系型数据库 首先,需要安装和注册DIPS。注…

Veket PuppyLinux系统装在U盘中

在碎片化或移动式办公的需求前,怎样才能做到只借助别人的硬件,而使用的是自己的操作系统以及保存数据呢?此时你可能会想到将某个Linux的桌面版本推送并存放在U盘中,便于按需进行启动与使用。 Veket是基于Puppy的一个Linux简体中文…

Java调优:Mybaitis的缓存优化

作者:肥朝,来自肥朝(ID:feichao_java)我们先来看代码这段代码中, Mybatis一共发了两条SQL,这就好像说, Mybatis中没有缓存,然后我们打开Mybatis的文档一看,顿时震惊这难道是骗人的,说好的默认开启缓存呢…..其实不是的…

Shell编程之多命令顺序执行和管道符

1.多命令顺序执行: 打开!命令终端: 2.管道符 打开命令终端:

阿里一面 缓存穿透、缓存击穿、缓存雪崩和热点数据失效问题的解决方案

作者:乔二爷,来自:乔二爷(ID:hellozhouq)1 前言昨天晚上接到阿里的电面电话,过程中就问到了关于缓存相关的问题。虽然以前接触过,多多少少了解了一些。但是之前自己并没有好好记录这…

Fix chrome 下flash crash的问题

2019独角兽企业重金招聘Python工程师标准>>> 本来好好的,结果不知道为什么,在MAC下使用chrome不断出现flash插件的错误,网上搜了一下,看这里,要把chrome自带的flash插件注释掉。重启chrome好象是没什么问题…

为什么阿里巴巴建议集合初始化时,指定集合容量大小?

集合是Java开发日常开发中经常会使用到的。在之前的一些文章中,我们介绍过一些关于使用集合类应该注意的事项,如《为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作》。关于集合类,《阿里巴巴Java开发手册》中其实还有另外一个…

十五、Python操作mysql数据库

利用Navicat Premium 15软件连接mysql数据库,新建testdb数据库,并添加2个表usertest和userinfo。 main.py #!/usr/bin/python3 # -*- coding: utf-8 -*- import reimport pymysql # 导入模块myConn pymysql.connect(host127.0.0.1, # 主机模块port33…

面试必备的分布式事物方案

四月初,去面试了本市的一家之前在做办公室无人货架的公司,虽然他们现在在面临着转型,但是对于我这种想从传统企业往互联网行业走的孩子来说,还是比较有吸引力的。在面试过程中就提到了分布式事物问题。我又一次在没有好好整理的问…

记住:永远不要在MySQL中使用UTF-8

原文地址:https://dwz.cn/QS4wLyjh最近我遇到了一个bug&#xff0c;我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串&#xff0c;然后出现了一个离奇的错误&#xff1a;Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1我…

面试官:不使用synchronized和lock,如何实现一个线程安全的单例?

单例&#xff0c;大家肯定都不陌生&#xff0c;这是Java中很重要的一个设计模式。稍微了解一点单例的朋友也都知道实现单例是要考虑并发问题的&#xff0c;一般情况下&#xff0c;我们都会使用synchronized来保证线程安全。那么&#xff0c;如果有这样一道面试题&#xff1a;不…

Mac OS X中配置Apache

我使用的Mac OS X版本是10.8.2&#xff0c;Mac自带了Apache环境。 启动Apache设置虚拟主机启动Apache 打开“终端(terminal)”&#xff0c;输入 sudo apachectl -v&#xff0c;&#xff08;可能需要输入机器秘密&#xff09;。如下显示Apache的版本 接着输入 sudo apachectl st…

你真的理解零拷贝了吗?

作者&#xff1a;ksfzhaohui 来源&#xff1a;http://t.cn/ESALgwV前言从字面意思理解就是数据不需要来回的拷贝&#xff0c;大大提升了系统的性能&#xff1b;这个词我们也经常在java nio&#xff0c;netty&#xff0c;kafka&#xff0c;RocketMQ等框架中听到&#xff0c;经常…

一、华为鸿蒙开发HUAWEI DevEco Studio下载、安装与配置

一、HUAWEI DevEco Studio下载 https://developer.harmonyos.com/cn/develop 二、HUAWEI DevEco Studio安装 解压后&#xff0c;双击安装包。 打开启动 DevEco Studio 三、DevEco Studio配置 DevEco Studio开发环境需要依赖于网络环境&#xff0c;需要连接上…

从JDK中,我们能学到哪些设计模式?

作者&#xff1a;肥朝 来自&#xff1a;肥朝&#xff08;ID&#xff1a;feichao_java&#xff09;结构性模式&#xff1a;适配器模式&#xff1a;常用于将一个新接口适配旧接口肥朝小声逼逼&#xff1a;在我们业务代码中经常有新旧接口适配需求&#xff0c;可以采用该模式。桥…