iOS利用沙盒機(jī)制做數(shù)據(jù)緩存

沙盒簡述:
每一個(gè)APP都有一個(gè)存儲(chǔ)空間一疯,就是沙盒计露。
APP之間不能相互通信尊惰。
沙盒根目錄結(jié)構(gòu):Documents郁轻、Library、temp新啼。

  • 1.在iOS開發(fā)中追城,經(jīng)常會(huì)用到數(shù)據(jù)緩存的功能,我的這個(gè)Demo是基于沙盒路徑機(jī)制做的緩存;如果程序并沒有被關(guān)閉燥撞,一直在運(yùn)行,那么此時(shí)內(nèi)存緩存中有數(shù)據(jù)座柱,硬盤緩存中有數(shù)據(jù)。如果此時(shí)再次請(qǐng)求數(shù)據(jù)物舒,直接使用內(nèi)存緩存中的數(shù)據(jù)即可色洞。將服務(wù)器第一次返回的數(shù)據(jù)保存在沙盒里面。這樣在手機(jī)斷網(wǎng)的情況下可以從本地讀取數(shù)據(jù)了冠胯。
  • 2.緩存的注意事項(xiàng)
    緩存的設(shè)置需要根據(jù)具體的情況考慮火诸,如果請(qǐng)求某個(gè)URL的返回?cái)?shù)據(jù):
      (1)經(jīng)常更新:不能用緩存荠察!比如股票置蜀、彩票數(shù)據(jù)
      (2)一成不變:果斷用緩存
     ∠づ琛(3)偶爾更新:可以定期更改緩存策略 或者 清除緩存
    提示:如果大量使用緩存盯荤,會(huì)越積越大,建議定期清除緩存(接下來完善焕盟,添加)
  • 3.再次介紹一下沙盒
    文件都在個(gè)人用戶名文件夾下的一個(gè)隱藏文件夾里秋秤,中文叫資源庫,他的目錄其實(shí)是Library脚翘。因?yàn)閼?yīng)用是在沙箱(sandbox)中的灼卢,在文件讀寫權(quán)限上受到限制,只能在幾個(gè)目錄下讀寫文件:
  • Documents:用于存儲(chǔ)用戶數(shù)據(jù)来农,iTunes備份和恢復(fù)的時(shí)候會(huì)包括此目錄鞋真,所以,蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下沃于。
  • tmp:存放臨時(shí)文件灿巧,這個(gè)可以放一些當(dāng)APP退出后不再需要的文件,iTunes不會(huì)備份和恢復(fù)此目錄揽涮,此目錄下文件可能會(huì)在應(yīng)用退出后刪除
  • Library/Caches:存放緩存文件,iTunes不會(huì)備份此目錄饿肺,此目錄下文件不會(huì)在應(yīng)用退出刪除

ZJDataCache.h文件代碼
#import <Foundation/Foundation.h>
/*
緩存:臨時(shí)保存數(shù)據(jù)的一種形式
通過接口請(qǐng)求數(shù)據(jù),將數(shù)據(jù)在本地保存一份(將數(shù)據(jù)保存到本地文件).當(dāng)在一段時(shí)間內(nèi)重新訪問當(dāng)前界面時(shí),不必從接口請(qǐng)求數(shù)據(jù),而是將本地的數(shù)據(jù)拿來使用.這個(gè)過程叫做對(duì)數(shù)據(jù)的緩存.

 作用:為用戶節(jié)省大量的流量,提高效率,提高用戶體驗(yàn).
 缺點(diǎn):不能拿到實(shí)時(shí)的數(shù)據(jù)
 */
@interface ZJDataCache : NSObject
//創(chuàng)建單例對(duì)象
+(ZJDataCache *)sharedCache;
//存數(shù)據(jù)
-(BOOL)saveDataWithData:(NSData *)data andStringName:(NSString *)name;
//取數(shù)據(jù)
-(NSData *)getDataWithStringName:(NSString *)name;
@end

ZJDataCache.m文件
#import "ZJDataCache.h"
#import "NSString+Hashing.h"
@interface ZJDataCache ()
@property (nonatomic,assign) NSTimeInterval invaliteTime;//有效時(shí)間
@end
@implementation ZJDataCache
//創(chuàng)建單例對(duì)象
static ZJDataCache cache = nil;
/
*
* @author zhengju, 16-06-30 17:06:27
*
* @brief 單例創(chuàng)建緩存對(duì)象
*
* @return 單例對(duì)象
/
+(ZJDataCache )sharedCache{
@synchronized(self){
if (!cache) {
cache = [[[ZJDataCache class] alloc]init];
}
}
return cache;
}
+(instancetype)allocWithZone:(struct _NSZone )zone{
@synchronized(self){
if (!cache) {
cache = [super allocWithZone:zone];
}
}
return cache;
}
/

* @author zhengju, 16-06-30 17:06:49
*
* @brief 初始化的時(shí)候返設(shè)置過期時(shí)間
*
* @return 對(duì)象
/
-(id)init{
if (self = [super init]) {
_invaliteTime = 60
60;//以秒為單位
}
return self;
}
/
*
* @author zhengju, 16-06-30 17:06:43
*
* @brief 存數(shù)據(jù)
*
* @param data 緩存Data數(shù)據(jù)
* @param name 段路徑蒋困,一般用請(qǐng)求數(shù)據(jù)的短URL來傳值
*
* @return 是否保存數(shù)據(jù)成功
*/
-(BOOL)saveDataWithData:(NSData *)data andStringName:(NSString *)name{
//獲取路徑
NSString *path = [NSString stringWithFormat:@"%@/Documents/Cache/",NSHomeDirectory()];//沙盒路徑
NSFileManager manager = [NSFileManager defaultManager];
BOOL isSuc = [manager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
if (!isSuc) {
NSLog(@"創(chuàng)建失敗");
return NO;
}
//先將文件名字進(jìn)行加密處理
//MD5:一種加密方式,通過MD5加密會(huì)得到一個(gè)16進(jìn)制的32位的文件(固定長度)
name = [name MD5Hash];
//獲取的完整路徑
NSString allPath = [NSString stringWithFormat:@"%@%@",path,name];
BOOL isWriteSuc = [data writeToFile:allPath atomically:YES];//寫文件
return isWriteSuc;
}
/

* @author zhengju, 16-06-30 17:06:44
*
* @brief 根據(jù)路徑查找Data數(shù)據(jù)
*
* @param name 段路徑
*
* @return 返回緩存的在段路徑下的Data數(shù)據(jù)
*/
-(NSData *)getDataWithStringName:(NSString *)name{
NSString *tempName = [name MD5Hash];
NSString *path = [NSString stringWithFormat:@"%@/Documents/Cache/%@",NSHomeDirectory(),tempName];
// NSLog(@"--path----->>%@",path);
//判斷文件是否存在
NSFileManager *manage = [NSFileManager defaultManager];
if (![manage fileExistsAtPath:path]) {
NSLog(@"文件不存在");
return nil;
}
//判斷數(shù)據(jù)是否過期
NSTimeInterval invalitTime = [[NSDate date] timeIntervalSinceDate:[self getLastModefityDateWithFile:path]];
if (invalitTime >= _invaliteTime) {
return nil;
}
//取數(shù)據(jù)
NSData *data = [NSData dataWithContentsOfFile:path];
return data;
}
//獲取最后修改文件的日期
-(NSDate *)getLastModefityDateWithFile:(NSString *)path{
NSFileManager *manager = [NSFileManager defaultManager];
NSDictionary dic = [manager attributesOfItemAtPath:path error:nil];
/

NSFileCreationDate = "2015-08-10 03:38:15 +0000";
NSFileExtensionHidden = 0;
NSFileGroupOwnerAccountID = 20;
NSFileGroupOwnerAccountName = staff;
NSFileModificationDate = "2015-08-10 03:38:15 +0000";
NSFileOwnerAccountID = 501;
NSFilePosixPermissions = 420;
NSFileReferenceCount = 1;
NSFileSize = 17090;
NSFileSystemFileNumber = 9204533;
NSFileSystemNumber = 16777217;
NSFileType = NSFileTypeRegular;
*/
return dic[NSFileModificationDate];
}
@end

本文參考: iOS沙盒目錄結(jié)構(gòu)解析

歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處敬辣。
github下載地址:https://github.com/zhengju/DataCache

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雪标,一起剝皮案震驚了整個(gè)濱河市零院,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌村刨,老刑警劉巖告抄,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嵌牺,居然都是意外死亡打洼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門逆粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來募疮,“玉大人,你說我怎么就攤上這事僻弹“⑴ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蹋绽,是天一觀的道長芭毙。 經(jīng)常有香客問我,道長卸耘,這世上最難降的妖魔是什么退敦? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鹊奖,結(jié)果婚禮上苛聘,老公的妹妹穿的比我還像新娘。我一直安慰自己忠聚,他們只是感情好设哗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著两蟀,像睡著了一般网梢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赂毯,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天战虏,我揣著相機(jī)與錄音,去河邊找鬼党涕。 笑死烦感,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膛堤。 我是一名探鬼主播手趣,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼肥荔!你這毒婦竟也來了绿渣?” 一聲冷哼從身側(cè)響起朝群,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎中符,沒想到半個(gè)月后姜胖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淀散,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年右莱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吧凉。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隧出,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阀捅,到底是詐尸還是另有隱情胀瞪,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布饲鄙,位于F島的核電站凄诞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏忍级。R本人自食惡果不足惜帆谍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轴咱。 院中可真熱鬧汛蝙,春花似錦、人聲如沸朴肺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戈稿。三九已至西土,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鞍盗,已是汗流浹背需了。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留般甲,地道東北人肋乍。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像敷存,于是被迫代替她去往敵國和親住拭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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