IOS缓存技术

前言:


为什么使用缓存,最直观的优势在于用户使用APP的体验上。举一个场景例子,比如现如今市面上的新闻应用,用户上了地铁或者走到一个网络信号极端差的区域,此刻尴尬的局面出现,因为没有网络,导致应用不能反馈给用户任何信息,作为用户的你是不是有种焦急不安的烦躁,想立刻删除应用的冲动,慢着今天的主角缓存来也,他将瞬间弥补此刻的尴尬,为什么这么说,用户了解自己的生活环境,他知道哪些区域网络的卡顿,在网络卡顿之前首先缓存一部分自己关注的东西在手机上,就算遇到没有网络的情况,手机照样能及时显示用户关心的数据。好了闲话到此打住,开始进入我们今天的主题"缓存"。

IOS中缓存技术了解


  1. CoreData:CoreData技术其实是苹果对Sqlite数据库操作进行的封装,Sqlite是一款小型数据库,因为安装方便体积小被广发应用到移动平台,在移动平台主要担任处理逻辑较为复杂的数据集,但在真实开发中操作步骤相比其他技术较为复杂,所以开发中应用的不是太过于广泛。
  1. Plist文件:通过对plist文件读写操作,将数据存储,底下的NSUserDefualt以及NSCoding技术的底层实现就是通过对plist多层封装而达到的效果,plist的弊端就是数据量小,而且对于频率操作增删改查就有点不是很擅长。
  2. NSUserDefault:用户偏好设置,因操作灵活语法简练,两行代码便能完成存储数据的操作,一般可以存储系统中常见对象,例如: NSString,NSArray,NSDictionary,int,BOOL...因此被开发者们追捧,但其弊端也不可小视,不能存储模型对象,而且存储量小,所以只能被小范围使用。
  3. NSCoding:目前比较主流的缓存技术,可以说他弥补了NSUserDefault所带来的缺失,但是有一点必须注意,如果数据量特别大(上万条数据),那么还是请使用CoreData技术实现比较好。

实际操作


备注:因为Sqlite相对操作复杂,我们把它放到最后去讲解。

  • 我们看下Plist文件的读写操作:
/**
 *  读出数据
 *
 *  @param plistName plist文件
 *
 *  @return 取出的数据
 */
+ (__kindof NSArray *)getDataWithPlistName:(NSString *)plistName
{
    // 1.拿到沙盒中的Documents目录
    NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [docPaths objectAtIndex:0];
    
    // 2.拼接需要操作文件的路径
    NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",plistName]];
    
    // 3.返回数据
    return [NSArray arrayWithContentsOfFile:filePath];
}

/**
 *  写数据到plist文件上
 *
 *  @param plistName    plist 文件名
 *  @param data         存储的数据(系统对象都能存储,存储的数据都会默认放在数组里)
 *  @param successBlock 文件创建成功
 *  @param errorBlock   文件创建失败
 */
+ (void)writeDataWithPlistName:(NSString *)plistName
                      withData:(id)data
              withSuccessBlock:(void(^)(NSString *))successBlock
                withErrorBlock:(void(^)(NSString *))errorBlock
{
    // 1.拿到沙盒中的Documents目录
    NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [docPaths objectAtIndex:0];
    
    // 2.拼接需要操作文件的路径
    NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",plistName]];
    
    // 3.准备数据
    NSArray *testDataArray = @[data];
    
    // 4.创建文件
    NSFileManager *fm = [NSFileManager defaultManager];
    if ([fm createFileAtPath:filePath contents:nil attributes:nil]) {
        // 5.写数据到plist文件
        [testDataArray writeToFile:filePath atomically:YES];
        successBlock(@"文件创建成功");
    }else{
        errorBlock(@"文件创建失败");
    }
    
}
  • 我们再看下UserDefault存储
// 偏好设置值
- (void)getUserDefault
{
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    NSLog(@"str-->%@",[ud objectForKey:@"str"]);
    NSLog(@"integer-->%tu",[ud integerForKey:@"integer"]);
    NSLog(@"bool-->%d",[ud boolForKey:@"bool"]);
    NSLog(@"float-->%f",[ud floatForKey:@"float"]);
    NSLog(@"double-->%f",[ud doubleForKey:@"double"]);
    NSLog(@"value-->%@",[ud valueForKey:@"value"]);
    NSLog(@"url-->%@",[ud URLForKey:@"url"]);
}

// 偏好设置值
- (void)setUserDefault
{
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setObject:@"NSString" forKey:@"str"];
    [ud setInteger:1 forKey:@"integer"];
    [ud setBool:YES forKey:@"bool"];
    [ud setFloat:1.1 forKey:@"float"];
    [ud setValue:@"value" forKey:@"value"];
    [ud setDouble:1.1111 forKey:@"double"];
    [ud setURL:[NSURL URLWithString:@"http://www.baidu.com"] forKey:@"url"];
}
  • NSCoding存储:
// ----------- .h文件------------------
#import <Foundation/Foundation.h>

@interface UserModel : NSObject <NSCoding>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;

@end

// ----------- .m文件------------------
#import "UserModel.h"

@implementation UserModel

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntForKey:@"age"];
    }
    return self;
}

// ----------- 测试------------------
  // NSCoding方式存取值
   UserModel *user = [UserModel new];
   UserModel *user1 = [UserModel new];
    
    [user setName:@"小明"];
    [user setAge:20];

    // 数据归档
    NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:user];
    [[NSUserDefaults standardUserDefaults] setObject:archiveCarPriceData forKey:@"DataArray"];

    // 数据接档
    NSData *myEncodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"DataArray"];
    user1 = [NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
    NSLog(@"name-->%@  age-->%d",user1.name,user1.age);

@end
总结:

文章对IOS开发中常用到的一些存储技术做了大概介绍,各有利弊没有最好也没有最坏,用到刀刃上都是最好。文章或许存在不足,欢迎你来挑刺,如果感兴趣请添加QQ群:126440594 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 数据存储 sqlite中插入特殊字符的方法和接收到处理方法。 除’其他的都是在特殊字符前面加“/”,而 ' -> ...
    b485c88ab697阅读 7,187评论 2 32
  • 在程序开发中,数据层永远是程序的核心结构之一。我们将现实事物进行抽象,使之变成一个个数据。对这些数据的加工处理是代...
    sindri的小巢阅读 16,826评论 13 85
  • 在程序开发中,数据层永远是程序的核心结构之一。我们将现实事物进行抽象,使之变成一个个数据。对这些数据的加工处理是代...
    帅不过oneS阅读 589评论 0 1
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 刚上大学谁都不认识,于是和我一个寝室又同一个班的楠月很自然的成为了最好的朋友,我们的感情一直升温甚至无话不说。我因...
    大野卿阅读 176评论 0 1