我需要使用自定义对象保存许多NSMutableArray,我想知道执行此操作的最佳方法是什么。
也许NSUserDefaults不是最好的方法。
我应该使用什么?
答案 0 :(得分:2)
如果您的数组包含非plist 对象,then you cannot use NSUserDefaults
without first encoding the array.
value参数只能是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。对于NSArray和NSDictionary对象,它们的内容必须是属性列表对象。
您需要对其进行编码using NSKeyedArchiver
。这会为您提供一个NSData
对象,然后您可以将其存储在NSUserDefaults
中,或将其写入通过NSKeyedArchiver
本身提交。
您需要做的就是在自定义对象中使用NSCoding
,并覆盖initWithCoder:
以在加载对象时初始化对象,并在编码时对encodeWithCoder:
进行编码以对变量进行编码。例如,您的自定义对象将如下所示:
@interface customArrayObject : NSObject <NSCoding>
@property (nonatomic) NSString* foo;
@property (nonatomic) NSInteger bar;
@end
@implementation customArrayObject
-(instancetype) initWithCoder:(NSCoder *)aDecoder { // decode variables
if (self = [super init]) {
_foo = [aDecoder decodeObjectForKey:@"foo"];
_bar = [aDecoder decodeIntegerForKey:@"bar"];
}
return self;
}
-(void) encodeWithCoder:(NSCoder *)aCoder { // encode variables
[aCoder encodeObject:_foo forKey:@"foo"];
[aCoder encodeInteger:_bar forKey:@"bar"];
}
@end
还值得注意的是NSUserDefaults
用于存储用户偏好 ,因此如果您的数组包含的数据不是以任何方式执行的根据用户偏好,您不应该使用NSUserDefaults
- 您应该自己将其写入磁盘。
将数组写入磁盘实际上比听起来要简单得多,您可以在archiveRootObject:toFile:
上使用NSKeyedArchiver
方法。例如,这会将您的自定义数组写入文档目录:
// Gets the documents directory path
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES)[0];
// Archive and save the file to foo.dat in the documents directory. Returns whether the operation was successful.
BOOL success = [NSKeyedArchiver archiveRootObject:customArray toFile:[NSString stringWithFormat:@"%@/%@", documentsPath, @"foo.dat"]]
但是,值得注意的是,关于操作是否成功,这个单元(是/否)在错误处理方面并不是那么好。如果要实现自定义错误处理,然后您将首先使用NSKeyedArchiver
的{{1}}方法,然后使用archivedDataWithRootObject:
的{{1}}方法对对象进行编码。