在iOS开发中,经常需要将数据存储到本地,实现的策略有很多,本篇文章简单介绍一下文件存储方式。
存储位置
我们可以将各种各样的数据存储到本地,在iOS应用中,这些文件应当存储在沙盒中
如果是需要持久化的数据应当存储在沙盒的Documents目录当中,如:
NSString * docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
NSString * path = [docPath stringByAppendingPathComponent:@"file.txt"];
存储的数据格式
二进制数据:使用NSFileHandle类,如:
NSFileHandle * fh = [NSFileHandle fileHandleForWritingAtPath:path];
[fh writeData:data];
其中data是一个NSData对象,可以是任何数据
plist格式:与OC中的字典、数组、数值对象对应的非常好
这几种对象都可以有直接进行文件操作的方法,如:arrayWithContentOfFile: writeToFile:
JSON/XML格式:
网络开发中,网络上的数据特别是移动端进行网络通信中的数据大部分采用JSON/XML格式
从网络获取这些格式的数据封装在NSData对象中,可以直接调用NSData下面的方法进行文件存储:
+ (instancetype)dataWithContentsOfFile:(NSString *)path
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)atomically
归档存储
另一个特殊的存储方式是将模型对象直接进行归档存储
要求:模型对象遵循NSCoding协议,并实现协议中的两个协议方法
如:
//AMPerson.h
@interface AMPerson : NSObject <NSCoding>
@property (nonatomic) NSString * name;
@property (nonatomic) NSNumber * age;
@end
//AMPerson.m
- (void)encodeWithCoder:(NSCoder *)aCoder
{//NSCoder是编码器对象
[aCoder encodeObject:self.name forKey:@"aaa"];
[aCoder encodeObject:self.age forKey:@"bbb"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if ( self = [super init] ) {
self.name = [aDecoder decodeObjectForKey:@"aaa"];
self.age = [aDecoder decodeObjectForKey:@"bbb"];
}
return self;
}
//归档存储
AMPerson * p1 = [[AMPerson alloc] init];
p1.name = @"aaa";
p1.age = @10;
AMStudent * p2 = [[AMStudent alloc] init];
p2.name = @"bbb";
p2.age = @20;
p2.score = @99;
AMPerson * p3 = [[AMPerson alloc] init];
p3.name = @"ccc";
p3.age = @30;
NSArray * arr = @[p1, p2, p3];
[NSKeyedArchiver archiveRootObject:arr toFile:path];
//解档读取
NSArray * arr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。