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;
}
duplication possible de [Comment stocker des objets personnalisés dans NSUserDefaults] (http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults) –