2011-06-10 58 views
0

我有一个可怕的时间节省这些可变数组到NSUserDefaults。我尝试了几种方法来尝试这一点,但似乎无法得到它。我试图添加字典和它的对象,数组然后字典,字典和字典的实际字符串,但似乎没有任何工作。iPhone持久数据与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和转储显示

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设置...这里是我用于编码对象的代码,但是如何告诉对象何时他们已经被编码了吗?

在.h文件我只是

@property (assign, readwrite) NSString*tweet; 
@property (assign, readwrite) NSString*author; 

在.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; 
} 
+0

可能重复[如何在NSUserDefaults中存储自定义对象](http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults) – 2014-01-15 07:43:34

回答

3

你需要实现你的TweetNSCoding协议。 From the documentation

的类NSUserDefaults的仅支持 对象可以 序列化到属性列表的存储。这种限制似乎从用户默认的 系统中排除了许多对象,如NSColor和 NSFont对象。但是,如果对象符合 NSCoding协议,则可以将它们归档为 为NSData对象,它们是属性 列表兼容的对象。