自动草稿

责任编辑许可转发,译者:赫尔曼呵呵(DD91)

iOS 合作开发中协进会加进各式各样缓存,YYCache也许是你最合适的优先选择。操控性上有竞争优势,用语也很单纯。译者ibireme曾对照过同行业车轮:YYCache 结构设计路子

1.单纯洼瓣

自动草稿

2.YYCache.h形式预测

@interface YYCache : NSObject
// 加载现阶段资料库中文名称
@property (copy, readonly) NSString *name;
// memoryCache缓存缓存,diskCache文档缓存
@property (strong, readonly) YYMemoryCache *memoryCache;
@property (strong, readonly) YYDiskCache *diskCache;
// 可透过上面四种形式来示例化YYCache第一类
– (nullable instancetype)initWithName:(NSString *)name;
– (nullable instancetype)initWithPath:(NSString *)path NS_DESIGNATED_INITIALIZER;
(nullable instancetype)cacheWithPath:(NSString *)path;
// 明令禁止透过上面三个形式示例化第一类
– (instancetype)init UNAVAILABLE_ATTRIBUTE;
(instancetype)new __attribute__((unavailable(“new形式不容用,请用initWithName:”)));
// 透过key推论与否缓存了某一小东西,第三个法是触发器继续执行,触发器反弹
– (BOOL)containsObjectForKey:(NSString *)key;
– (void)containsObjectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key, BOOL contains))block;
// 读–透过key加载缓存,第三个法是触发器继续执行,触发器反弹
– (nullable id)objectForKey:(NSString *)key;
– (void)objectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key, id object))block;
// 增、改–缓存第一类(可缓存遵照NSCoding协定的第一类),第三个法是触发器继续执行,触发器反弹
– (void)setObject:(nullable id)object forKey:(NSString *)key;
– (void)setObject:(nullable id)object forKey:(NSString *)key withBlock:(nullable void(^)(void))block;
// 删–删掉缓存
– (void)removeObjectForKey:(NSString *)key;
– (void)removeObjectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key))block;
– (void)removeAllObjects;
– (void)removeAllObjectsWithBlock:(void(^)(void))block;
– (void)removeAllObjectsWithProgressBlock:(nullable void(^)(int removedCount, int totalCount))progress
endBlock:(nullable void(^)(BOOL error))end;
@end

3.YYCache使用

// 0.初始化YYCache
YYCache *cache = [YYCache cacheWithName:@”mydb”];
// 1.缓存普通字符
[cache setObject:@”赫尔曼呵呵” forKey:@”name”];
NSString *name = (NSString *)[cache objectForKey:@”name”];
NSLog(@”name: %@”, name);
// 2.缓存模型
[cache setObject:(id)model forKey:@”user”];
// 3.缓存数组
NSMutableArray *array = @.mutableCopy;
for (NSInteger i = 0; i

打印:

2016-06-09 11:35:44.069 YYCache源代码预测[13546:949048] {number = 2, name = (null)}
2016-06-09 11:35:44.069 YYCache源代码预测[13546:949048] array缓存完成….
2016-06-09 11:35:44.386 YYCache源代码预测[13546:949052] {number = 3, name = (null)}
2016-06-09 11:35:44.386 YYCache源代码预测[13546:949052] (
“”,
“”,
“”,
“”,
“”,
“”,
“”,
“”,
“”,
“”
)
// 缓存实现,默认同时进行缓存缓存与文档缓存
– (void)setObject:(id)object forKey:(NSString *)key {
[_memoryCache setObject:object forKey:key];
[_diskCache setObject:object forKey:key];
}
// 如果只想缓存缓存,可以直接调用`memoryCache`第一类
YYCache *cache2 = [YYCache cacheWithName:@”mydb”];
[cache2.memoryCache setObject:@24 forKey:@”age”];
NSLog(@”age缓存在缓存:%d”, [cache2.memoryCache containsObjectForKey:@”age”]);
NSLog(@”age缓存在文档:%d”, [cache2.diskCache containsObjectForKey:@”age”]);

打印:

2016-06-09 21:23:24.326 YYCache源代码预测[14512:1085375] age缓存在缓存:1
2016-06-09 21:23:24.326 YYCache源代码预测[14512:1085375] age缓存在文档:0

4.YYCache.h tips

if __has_include
import import import elif __has_include
import import import else
import “YYMemoryCache.h”
import “YYDiskCache.h”
import “YYKVStorage.h”
endif

__has_include:用来检查Frameworks与否引入某一类,

像YYWebImage已经集成YYCache,如果导入过YYWebImage则无需重新导入YYCache

NS_ASSUME_NONNULL_BEGIN
@interface YYCache : NSObject

– (nullable instancetype)initWithName:(NSString *)name;

@end
NS_ASSUME_NONNULL_END

接口中 nullable 的是少数,一般都为nonnull,为了防止写一大堆 nonnull,Foundation供了一对宏NS_ASSUME_NONNULL_BEGIN、NS_ASSUME_NONNULL_END,包在里面的第一类默认加 nonnull 修饰符,如果是nullable的,只需要把 nullable 的指出来就行

– (instancetype)init UNAVAILABLE_ATTRIBUTE;
(instancetype)new UNAVAILABLE_ATTRIBUTE;

command 鼠标左键UNAVAILABLE_ATTRIBUTE,

发现宏定义define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable)),

__attribute__是Clang提供的一种源代码注解,方便合作开发者向编译器表达某种要求,括号里是传达某种命令.

为方便使用,一些常用属性也被Cocoa定义成宏,

比如UNAVAILABLE_ATTRIBUTE、NS_CLASS_AVAILABLE_IOS(9_0).

unavailable告诉编译器该形式失效.

在封装单例或初始化某一类前必须做一些事时,对一些形式禁用是非常不错的优先选择.

还可以给个message提示:

(instancetype)alloc __attribute__((unavailable(“alloc形式不容用,请用initWithName:”)));
– (instancetype)init __attribute__((unavailable(“init形式不容用,请用initWithName:”)));
(instancetype)new __attribute__((unavailable(“new形式不容用,请用initWithName:”)));
– (instancetype)copy __attribute__((unavailable(“copy形式不容用,请用initWithName:”)));

责任编辑只是单纯剖析,接下来会预测YYMemoryCache实现原理.

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!