YYCache源碼分析(一)

2016-06-14 08:11編輯:cocopeng分類:iOS開發(fā)來源:漢斯哈哈哈的簡書

34436

iOSYYCache

本文授權(quán)轉(zhuǎn)載,作者:漢斯哈哈哈(簡書)

iOS 開發(fā)中總會用到各種緩存怔球,YYCache或許是你最好的選擇。性能上有優(yōu)勢夕晓,用法也很簡單亭畜。作者ibireme曾經(jīng)對比過同類輪子:YYCache 設(shè)計思路

1.簡單架構(gòu)圖

2.YYCache.h方法分析

@interface?YYCache?:?NSObject

//?讀取當(dāng)前數(shù)據(jù)庫名稱

@property?(copy,?readonly)?NSString?*name;

//?memoryCache內(nèi)存緩存循集,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判斷是否緩存了某個東西,第二個法是異步執(zhí)行,異步回調(diào)

-?(BOOL)containsObjectForKey:(NSString?*)key;

-?(void)containsObjectForKey:(NSString?*)key?withBlock:(nullable?void(^)(NSString?*key,?BOOL?contains))block;

//?讀--通過key讀取緩存筋栋,第二個法是異步執(zhí)行,異步回調(diào)

-?(nullable?id)objectForKey:(NSString?*)key;

-?(void)objectForKey:(NSString?*)key?withBlock:(nullable?void(^)(NSString?*key,?id?object))block;

//?增炊汤、改--緩存對象(可緩存遵從NSCoding協(xié)議的對象),第二個法是異步執(zhí)行,異步回調(diào)

-?(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.緩存數(shù)組

NSMutableArray?*array?=?@[].mutableCopy;

for(NSInteger?i?=?0;?i?<?10;?i?++)?{

[array?addObject:model];

}

//?異步緩存

[cache?setObject:array?forKey:@"user"withBlock:^{

//?異步回調(diào)

NSLog(@"%@",?[NSThread?currentThread]);

NSLog(@"array緩存完成....");

}];

//?延時讀取

dispatch_after(dispatch_time(DISPATCH_TIME_NOW,?(int64_t)(0.3?*?NSEC_PER_SEC)),?dispatch_get_main_queue(),?^{

//?異步讀取

[cache?objectForKey:@"user"withBlock:^(NSString?*?_Nonnull?key,?id??_Nonnull?object)?{

//?異步回調(diào)

NSLog(@"%@",?[NSThread?currentThread]);

NSLog(@"%@",?object);

}];

});

打颖兹痢:

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]?(

"",

"",

"",

"",

"",

"",

"",

"",

"",

""

)

//?緩存實現(xiàn)抢腐,默認(rèn)同時進行內(nèi)存緩存與文件緩存

-?(void)setObject:(id)object?forKey:(NSString?*)key?{

[_memoryCache?setObject:object?forKey:key];

[_diskCache?setObject:object?forKey:key];

}

//?如果只想內(nèi)存緩存,可以直接調(diào)用`memoryCache`對象

YYCache?*cache2?=?[YYCache?cacheWithName:@"mydb"];

[cache2.memoryCache?setObject:@24?forKey:@"age"];

NSLog(@"age緩存在內(nèi)存:%d",?[cache2.memoryCache?containsObjectForKey:@"age"]);

NSLog(@"age緩存在文件:%d",?[cache2.diskCache?containsObjectForKey:@"age"]);

打咏蠼弧:

1

22016-06-09?21:23:24.326?YYCache源碼分析[14512:1085375]?age緩存在內(nèi)存: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已經(jīng)集成YYCache,如果導(dǎo)入過YYWebImage則無需重新導(dǎo)入YYCache

NS_ASSUME_NONNULL_BEGIN

@interface?YYCache?:?NSObject

...

-?(nullable?instancetype)initWithName:(NSString?*)name;

...

@end

NS_ASSUME_NONNULL_END

接口中 nullable 的是少數(shù),一般都為nonnull,為了防止寫一大堆 nonnull,F(xiàn)oundation供了一對宏NS_ASSUME_NONNULL_BEGIN婿着、NS_ASSUME_NONNULL_END,包在里面的對象默認(rèn)加 nonnull 修飾符醋界,如果是nullable的,只需要把 nullable 的指出來就行

1

2-?(instancetype)init?UNAVAILABLE_ATTRIBUTE;

+?(instancetype)newUNAVAILABLE_ATTRIBUTE;

command+鼠標(biāo)左鍵UNAVAILABLE_ATTRIBUTE竟宋,

發(fā)現(xiàn)宏定義#define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable)),

__attribute__是Clang提供的一種源碼注解,方便開發(fā)者向編譯器表達某種要求,括號里是傳達某種命令.

為方便使用形纺,一些常用屬性也被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實現(xiàn)原理.

References

http://blog.sunnyxx.com/2016/05/14/clang-attributes/

http://blog.sunnyxx.com/2015/06/12/objc-new-features-in-2015/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挪捕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子争便,更是在濱河造成了極大的恐慌级零,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滞乙,死亡現(xiàn)場離奇詭異奏纪,居然都是意外死亡,警方通過查閱死者的電腦和手機斩启,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門序调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兔簇,你說我怎么就攤上這事发绢∮菜#” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵朴摊,是天一觀的道長默垄。 經(jīng)常有香客問我,道長甚纲,這世上最難降的妖魔是什么口锭? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮介杆,結(jié)果婚禮上鹃操,老公的妹妹穿的比我還像新娘。我一直安慰自己春哨,他們只是感情好荆隘,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赴背,像睡著了一般椰拒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凰荚,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天燃观,我揣著相機與錄音,去河邊找鬼便瑟。 笑死缆毁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的到涂。 我是一名探鬼主播脊框,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼践啄!你這毒婦竟也來了浇雹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤屿讽,失蹤者是張志新(化名)和其女友劉穎箫爷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聂儒,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡虎锚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衩婚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窜护。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖非春,靈堂內(nèi)的尸體忽然破棺而出柱徙,到底是詐尸還是另有隱情缓屠,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布护侮,位于F島的核電站敌完,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羊初。R本人自食惡果不足惜滨溉,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望长赞。 院中可真熱鬧晦攒,春花似錦、人聲如沸得哆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贩据。三九已至栋操,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饱亮,已是汗流浹背讼庇。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留近尚,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓场勤,卻偏偏與公主長得像戈锻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子和媳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • YYCache源碼分析(一) 文/漢斯哈哈哈(簡書作者)原文鏈接:http://www.reibang.com/p...
    kakukeme閱讀 621評論 0 51
  • iOS 開發(fā)中總會用到各種緩存格遭,YYCache或許是你最好的選擇。性能上有優(yōu)勢留瞳,用法也很簡單拒迅。作者ibireme曾...
    漢斯哈哈哈閱讀 11,825評論 23 75
  • 第一篇第二篇大概是把下載圖片緩存圖片的這個邏輯走完了,里面涉及好多類她倘。 羅列一下 UIView+WebCache ...
    充滿活力的早晨閱讀 751評論 0 1
  • “終于考完了璧微!”這句話不止我一個人在說,幾乎班里的每個同學(xué)都像復(fù)讀機一樣硬梁,重復(fù)著這句話前硫。轉(zhuǎn)頭環(huán)顧四周,有的同學(xué)...
    cy諾ooo閱讀 322評論 0 4
  • 畢業(yè)論文終于在今天凌晨今天之際發(fā)到導(dǎo)師楊Sir的郵箱荧止,原本打算中午帶著論文去科大接受導(dǎo)師指導(dǎo)的屹电,奈何楊Sir電...
    美夢成真666666閱讀 606評論 0 1