Answers:
我找到了一种替代方法,在保存之前,我使用编码了根对象(NSArray
对象)NSKeyedArchiver
,以结束NSData
。然后使用UserDefaults保存NSData
。
当我需要数据时,我读出NSData
,并用于NSKeyedUnarchiver
转换NSData
回该对象。
这有点麻烦,因为我NSData
每次都需要转换到/从中转换,但它确实可以工作。
这是每个请求的一个示例:
保存:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
加载:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
数组中的元素实现
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
然后在实现中CommentItem
,提供了两种方法:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
有人有更好的解决方案吗?
感谢大家。
如果要使用用户默认值保存对象,则从头到尾递归地所有对象都必须是属性列表对象。符合NSCoding在这里并不意味着什么- NSUserDefaults
不会自动将它们编码为NSData
,您必须自己做。如果“实现的对象列表NSCoding
”表示不是属性列表对象的对象,那么在保存为用户默认值之前,您必须对它们进行一些处理。
FYI财产清单类NSDictionary
,NSArray
,NSString
,NSDate
,NSData
,和NSNumber
。您可以NSMutableDictionary
为用户首选项编写可变的子类(例如),但您读出的对象始终是不可变的。
您的所有键都在字典NSString
s中吗?我认为必须将其保存到属性列表中。
最简单的答案:
NSDictionary
如果键是NSStrings,则它只是一个plist对象。因此,存储的“钥匙”为用。NSString
stringWithFormat
解决方案:
NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];
好处:
NULL
。您是否考虑过执行《NSCoding
议定书》?这将允许您使用通过实现的两种简单方法在iPhone上进行编码和解码NSCoding
。首先,您需要将添加NSCoding
到您的班级。
这是一个例子:
这是在.h文件中
@interface GameContent : NSObject <NSCoding>
然后,您将需要实现NSCoding协议的两种方法。
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
[self setFoundHotSpots:[coder decodeObjectForKey:@"foundHotSpots"]];
}
return self;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:foundHotSpots forKey:@"foundHotSpots"];
}
有关更多信息,请查看NSCoder上的文档。这对于我的项目确实非常方便,如果我关闭了该应用程序,则需要在iPhone上保存该应用程序的状态,然后将其恢复为打开状态。
关键是将协议添加到接口,然后实现一部分的两种方法NSCoding
。
我希望这有帮助!