[英]iPhone Persisting Data with NSUserDefaults
我将这些可变的 arrays 保存到 NSUserDefaults 中花费了很长时间。 我已经尝试了几种方法来尝试这个,但似乎无法得到它。 我试图添加字典及其对象、数组然后是字典、字典和字典包含的实际字符串,但似乎都不起作用。
这是我用来尝试将这些保存到我的用户默认值的代码...
- (void)statusesReceived:(NSArray *)statuses forRequest:(NSString *)connectionIdentifier
{
//tweets = [[NSMutableArray alloc] init];
for(NSDictionary *d in statuses) {
NSLog(@"See dictionary: %@", d);
Tweet *tweet = [[Tweet alloc] initWithTweetDictionary:d];
[tweets addObject:tweet];
[retweetCount addObject:tweet];
[authors addObject:tweet];
[avatarsURL addObject:tweet];
[friendsCount addObject:tweet];
[followerCount addObject:tweet];
[realNames addObject:tweet];
[userLocations addObject:tweet];
[statusesCounts addObject:tweet];
[favoriteCount addObject:tweet];
[tweet autorelease];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setValuesForKeysWithDictionary:d];
[userDefaults setObject:tweets forKey:@"text"];
[userDefaults setObject:authors forKey:@"scree_name"];
[userDefaults synchronize];
NSLog(@"setting value");
NSArray *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES);
NSLog(@"%@", path);
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *setpath = [documentsDirectory
stringByAppendingPathComponent:@"PropertyList.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: setpath])
{
NSString *bundle = [[NSBundle mainBundle] pathForResource:@"PropertyList"
ofType:@"plist"];
[fileManager copyItemAtPath:bundle toPath: setpath error:&error];
}
}
[self.tableView reloadData];
}
这就是 NSLog 和 Dump 显示的内容
2011-06-10 03:13:28.773 ThemeCatcher[9173:707] *** -[NSUserDefaults setObject:forKey:]:
Attempt to insert non-property value '(
"<Tweet: 0x2b02c0>",
"<Tweet: 0x2c1ab0>",
"<Tweet: 0x4a9110>",
"<Tweet: 0x4b0e60>",
"<Tweet: 0x4ac440>",
"<Tweet: 0x2c69a0>",
"<Tweet: 0x2c58b0>",
"<Tweet: 0x49ad50>",
"<Tweet: 0x2c6b90>",
"<Tweet: 0x2c7be0>",
"<Tweet: 0x4979b0>",
"<Tweet: 0x49ee60>",
"<Tweet: 0x4b4ea0>",
"<Tweet: 0x2c9400>",
"<Tweet: 0x4b5080>",
"<Tweet: 0x2c9d20>",
"<Tweet: 0x2ca1d0>",
"<Tweet: 0x4b4a30>",
"<Tweet: 0x2caff0>",
"<Tweet: 0x4b55f0>"
)' of class '__NSArrayM'.
2011-06-10 03:13:28.775 ThemeCatcher[9173:707] *** -[NSUserDefaults setObject:forKey:]:
Attempt to insert non-property value '(
"<Tweet: 0x2b02c0>",
"<Tweet: 0x2c1ab0>",
"<Tweet: 0x4a9110>",
"<Tweet: 0x4b0e60>",
"<Tweet: 0x4ac440>",
"<Tweet: 0x2c69a0>",
"<Tweet: 0x2c58b0>",
"<Tweet: 0x49ad50>",
"<Tweet: 0x2c6b90>",
"<Tweet: 0x2c7be0>",
"<Tweet: 0x4979b0>",
"<Tweet: 0x49ee60>",
"<Tweet: 0x4b4ea0>",
"<Tweet: 0x2c9400>",
"<Tweet: 0x4b5080>",
"<Tweet: 0x2c9d20>",
"<Tweet: 0x2ca1d0>",
"<Tweet: 0x4b4a30>",
"<Tweet: 0x2caff0>",
"<Tweet: 0x4b55f0>"
)' of class '__NSArrayM'.
2011-06-10 03:13:28.786 ThemeCatcher[9173:707] setting value
2011-06-10 03:13:28.789 ThemeCatcher[9173:707] (
"/var/mobile/Applications/0628FF60-6D3E-4FCA-A6F2-DFB8FC04EF6A/Library"
)
任何建议将不胜感激
谢谢我已经阅读了这些文件,并真的尝试研究了几次,但它确实是模糊的。 他们给出的例子并不真正符合我的标准或目标,我仍在寻找解决方案。 我已经在 Tweet.m 文件中实现了 NSCoding,但我不确定如何在设置了 NSUserDefaults 的 controller 中实现它……这是我用来编码对象的代码,但是我如何告诉对象何时保存它们已被编码?
在.h文件中我只是
@property (assign, readwrite) NSString*tweet;
@property (assign, readwrite) NSString*author;
in.m 文件
- (void)encodeWithCoder:(NSCoder *)encoder
{
//Encode properties, other class variables, etc
[encoder encodeObject:self.tweet forKey:@"text"];
[encoder encodeObject:self.author forKey:@"screen_name"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if( self != nil )
{
//decode properties, other class vars
self.tweet = [decoder decodeObjectForKey:tweet];
self.author = [decoder decodeObjectForKey:author];
}
return self;
}
您需要在Tweet
class 上实现NSCoding
协议。 从文档中:
NSUserDefaults class 仅支持存储可序列化为属性列表的对象。 这种限制似乎从用户默认系统中排除了多种对象,例如 NSColor 和 NSFont 对象。 但是如果对象符合 NSCoding 协议,它们可以归档到 NSData 对象,这些对象是属性列表兼容的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.