自定义对象数组解归档存储的plist文件

今天做到缓存通讯目录的缓存,通讯录里包括部门和人员,都对应的是一个相应的model,它是一个自定义的类型。所有就考虑用解归档的方法来存储。直接上代码吧。
//首先是自定义的类要遵循NSCoding协议
- (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeFloat:self.originX forKey:@"originX"]; [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeBool:self.isDepartment forKey:@"isDepartment"]; } -(id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if(self) { self.originX = [aDecoder decodeFloatForKey: @"originX"]; self.name = [aDecoder decodeObjectForKey:@"name"]; self.isDepartment = [aDecoder decodeBoolForKey:@"isDepartment"] ; } return self; }
//然后就是要把解归档的内容和plist文件做操作
- (void)loadRootContactData { NSData * resultdata = [[NSData alloc] initWithContentsOfFile:[self getPlistFilePath]]; NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultdata]; self.dataArray = [unArchiver decodeObjectForKey:@"contactList"]; }
- (void)saveRootContactData { NSMutableData *data = [[NSMutableData alloc] init] ; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data] ; [archiver encodeObject:self.dataArray forKey:@"contactList"]; [archiver finishEncoding]; BOOL success = [data writeToFile:[self getPlistFilePath] atomically:YES]; }
这里有需要注意的是存入的根级目录应该是NSDictionary或者NSArray。plist文件里的根级目录中只能是他们。我在调试中就试过直接存NSString,然后是无法实现的。[self getPlistFilePath]是获取路径是一个plist文件的路径。 然后这里的key要注意,消息被覆盖,然后存取应该一致。

或者存入用户偏好里,其实没太差差别,只是用户偏好一般保存应用程序的配置信息
NSData *encodedSingleObj = [NSKeyedArchiver archivedDataWithRootObject:self.dataArray]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:self.dataArray forKey:@"xxx"]; NSData *prevSavedData = [defaults objectForKey:@"xxx"]; self.dataArray = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:prevSavedData];
另外也可以直接快速存储。(这个直接Root和前面的区别在哪?查官方文档也没看出什么)。
[NSKeyedArchiver archiveRootObject:array toFile:fileName]; NSMutableArray * array = [NSKeyedUnarchiver unarchiveObjectWithFile:fileName];

你可能感兴趣的:(自定义对象数组解归档存储的plist文件)