繁体   English   中英

iPhone 使用 NSUserDefaults 持久化数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM