2011-06-10 4 views
0

Je passe énormément de temps à sauvegarder ces tableaux mutables dans le NSUserDefaults. J'ai essayé plusieurs façons d'essayer cela mais je n'arrive pas à l'obtenir. J'ai essayé d'ajouter le dictionnaire et ses objets, le tableau puis le dictionnaire, le dictionnaire et les chaînes réelles du dictionnaire mais rien ne semble fonctionner.Données persistantes iPhone avec NSUserDefaults

Voici le code que je utilise pour essayer de sauver ce à mes valeurs par défaut de l'utilisateur ...

- (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]; 



} 

Et c'est ce que le NSLog et Dump montre

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" 
) 

Toute suggestion serait J'ai beaucoup apprécié

Merci d'avoir lu les documents et j'ai vraiment essayé de les étudier plusieurs fois, mais c'est vraiment vague. L'exemple qu'ils donnent ne correspond pas vraiment à mes critères ou objectifs et je suis toujours à la recherche de la solution. J'ai implémenté le NSCoding dans le fichier Tweet.m mais je ne sais pas comment implémenter cela dans mon contrôleur où mes NSUserDefaults sont définies ... voici le code que j'utilise pour encoder les objets, mais comment dire les objets quand sauver, ils ont été codés?

Dans le fichier .h Je viens

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

Dans le fichier .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

duplication possible de [Comment stocker des objets personnalisés dans NSUserDefaults] (http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults) –

Répondre

3

Vous avez besoin de mettre en œuvre le protocole NSCoding de votre classe Tweet. From the documentation:

La classe NSUserDefaults ne supporte que le stockage des objets qui peuvent être sérialisé à des listes de propriétés. Cette limitation semble exclure plusieurs types d'objets , tels que les objets NSColor et NSFont, à partir du système par défaut de l'utilisateur. Mais si les objets se conforment au protocole NSCoding , ils peuvent être archivés aux objets NSData, qui sont la propriété des objets compatibles avec la liste.

Questions connexes