资讯专栏INFORMATION COLUMN

iOS开发系列--数据缓存那些小技巧

taoszu / 1289人阅读

摘要:开发中,经常需要对数据作缓存处理,以便于在手机网络不佳时,能作一个离线预加载,提高用户体验。直到有一天,终于发现了一个方便简捷的方式去对数据作缓存处理。归档是一个数据持久化的过程,该过程用某种格式来保存一个或多个对象,以便以后还原这些对象。

APP开发中,经常需要对数据作缓存处理,以便于在手机网络不佳时,能作一个离线预加载,提高用户体验。
最早遇到这类需求的时候,我使用的是Sqlite。需要创建数据库,对数据作大量的处理,过程非常繁琐。而且在使用Sqlite时,还经常操作不当,造成数据锁死,进而导致无法正常对数据进行读写操作。
由于当时自己经验不足,没有其它更好的办法,一直在这个坑里跳不出去。直到有一天,终于发现了一个方便简捷的方式去对数据作缓存处理。这就是今天所介绍的方法:使用NSKeyedArchiver作数据持久化。

归档是一个数据持久化的过程,该过程用某种格式来保存一个或多个对象,以便以后还原这些对象。
直接上代码吧
首页是JsonCacheData.h文件

#import 

@interface JsonCacheData : NSObject

/**
 *  防止备份到iTunes
 *
 *  @param URL 本地Path
 *
 *  @return 是否成功
 */
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL;

/**
 *  保存数据到本地
 *
 *  @param data 字典或数组
 *  @param key  通过Key保存或读取
 *
 *  @return 是否成功
 */
+ (BOOL)writePlistWithData:(id)data saveKey:(NSString *)key;

/**
 *  清除数据
 *
 *  @param key  通过Key清除
 *
 *  @return 是否成功
 */
+ (BOOL)clearWithKey:(NSString *)key;

/**
 *  通过Key读取本地缓存
 *
 *  @param key Key
 *
 *  @return 字典或数组
 */
+ (id)readPlistWithKey:(NSString *)key;

@end

JsonCacheData.m文件

#import "JsonCacheData.h"

//获取Cache目录路径
#define CACHEPATH       [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]

@implementation JsonCacheData

//防止备份到iTunes和iCloud(上架审核必备)
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    if ([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]) {
        NSError *error = nil;
        BOOL success = [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
        if(!success){
            NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
        }
        return success;
    }
    return YES;
}

#pragma mark 缓存数据
+ (BOOL)writePlistWithData:(id)data saveKey:(NSString *)key
{
    BOOL success;
    NSString *path = [[CACHEPATH stringByAppendingPathComponent:key] stringByAppendingString:@"CacheData.plist"];//获取路径
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //判断是否存在,不存在则创建路径
    if (![fileManager fileExistsAtPath:path]) {
        [fileManager createFileAtPath:path contents:nil attributes:nil];
    }
    
    NSData *cacheData = [NSKeyedArchiver archivedDataWithRootObject:data];
    success = [cacheData writeToFile:path atomically:YES];
    [self addSkipBackupAttributeToItemAtURL:[NSURL fileURLWithPath:path]];
    NSLog(@"Key: %@ , 数据缓存 %@", key, success ? @"成功" : @"失败");
    return success;
}

#pragma mark 清除缓存
+ (BOOL)clearWithKey:(NSString *)key
{
    NSString *path = [[CACHEPATH stringByAppendingPathComponent:key] stringByAppendingString:@"CacheData.plist"];//获取路径
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //判断是否存在
    if (![fileManager fileExistsAtPath:path]) {
        return NO;
    }
    else {
        return [fileManager removeItemAtPath:path error:nil];
    }
}

#pragma mark 读取缓存
+ (id)readPlistWithKey:(NSString *)key
{
    NSString *path = [[CACHEPATH stringByAppendingPathComponent:key] stringByAppendingString:@"CacheData.plist"];//获取路径
    id object = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    return object;
}

@end

接下来看下实际的使用情况:
通过接口得到的Json数据直接传入进来,用banners这个唯一Key来做本地数据持久化缓存:

保存到本地后的样子是这样的:

然后再是通过banners这个唯一Key来读取缓存:


愿所有人不会再掉入我曾踩过的那些坑!
希望这篇文章能给你带来一点帮助!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17010.html

相关文章

  • iOS开发系列--数据缓存那些技巧

    摘要:开发中,经常需要对数据作缓存处理,以便于在手机网络不佳时,能作一个离线预加载,提高用户体验。直到有一天,终于发现了一个方便简捷的方式去对数据作缓存处理。归档是一个数据持久化的过程,该过程用某种格式来保存一个或多个对象,以便以后还原这些对象。 APP开发中,经常需要对数据作缓存处理,以便于在手机网络不佳时,能作一个离线预加载,提高用户体验。最早遇到这类需求的时候,我使用的是Sqlite。...

    YacaToy 评论0 收藏0
  • ios好文

    摘要:在上面的中,苹果还对具体的细节做出了要求。不过,就在今天,苹果宣布将这个无限期推迟。不网络请求之与的二次封装及意义之后,被苹果抛弃,该来的即便是迟些,但最终肯定会来。适配,极光推送用户要做这处更改升级至建议尽快升级。 iOS10 通知 extension 之 Service Extension 你玩过了吗? iOS10 通知 extension 之 Service Extension ...

    Caizhenhao 评论0 收藏0
  • 我的大前端- 收藏集 - 掘金

    摘要:下面围绕的这样的目的,即左右知乎网页上屏幕截图功能的实现前端掘金背景最近注意到知乎的屏幕截图反馈功能,感觉非常不错。正如你期望的,文中的闯关记之垃圾回收和内存管理前端掘金题图来源,授权基于协议。 微信小程序实战学习 起手式 DEMO 仿肯德基 - 前端 - 掘金小程序?大场景? 微信小程序本质上来说就是一个 HTML 5(移动网页) 应用,用view、scoll-view代替了div标...

    LdhAndroid 评论0 收藏0
  • 「码个蛋」2017年200篇精选干货集合

    摘要:让你收获满满码个蛋从年月日推送第篇文章一年过去了已累积推文近篇文章,本文为年度精选,共计篇,按照类别整理便于读者主题阅读。本篇文章是今年的最后一篇技术文章,为了让大家在家也能好好学习,特此花了几个小时整理了这些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 让你收获满满! 码个蛋从2017年02月20...

    wangtdgoodluck 评论0 收藏0
  • 前端资源系列(4)-前端学习资源分享&前端面试资源汇总

    摘要:特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 本以为自己收藏的站点多,可以很快搞定,没想到一入汇总深似海。还有很多不足&遗漏的地方,欢迎补充。有错误的地方,还请斧正... 托管: welcome to git,欢迎交流,感谢star 有好友反应和斧正,会及时更新,平时业务工作时也会不定期更...

    princekin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<