最近一个朋友问我如何自己做一个图片缓存功能,说实话之前还真的没有好好研究下,到底是如何在项目中做缓存的?以及如果需要更加机密的缓存如何做呢?正好项目中做了不错的缓存功能,我就抛砖引玉了,大神请见谅,本人眼界有限,求拍砖。
首先明白一点,OC是存在一个缓存类的,关键我们是如何使用它的。
@interface NSCache : NSObject {
- (id)objectForKey:(id)key;
- (void)setObject:(id)obj forKey:(id)key; // 0 cost
上面的两个红色的方法,就告诉我们使用的方法就是通过类似设置字典键值对的形势来保存数据的。所以可以简化理解为缓存类就是一个自定义字典。我们要缓存的话,只需要把这个字典做成一个在在app所有页面都唯一存在的字典就好了,所以需要把它设置为一个单例类,什么是单例类大家自己去查查。
还有个一个点大家可能没有考虑到,就是我们的沙盒中明明也存在一个叫做cache的文件夹,这个就是保存缓存数据的文件夹,所以我们要联合起来用。
如何联合来用?
大致思路就是我们保存到缓存单例类的同时也保存在沙盒缓存(保存到沙盒缓存中记得在主线程中执行)中,获取的时候首先去获取缓存类中的缓存数据,如果不存在在去沙盒缓存文件夹下去获取,最后再找不到才算不存在缓存数据。
说了一大通我们先看看AFNetworking源码是如何缓存图片的。
// UIImageView+AFNetworking.m
//
// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHE