iPhone: не удалось сохранить NSMutableDictionary в NSUserDefaults - PullRequest
2 голосов
/ 06 июля 2011

Я пытаюсь реализовать функцию «Добавить в избранное», используя NSMutableDictionary, так как мне нужно добавить несколько значений ключа.Следующий метод addToFavourites всегда отображает Count = 0 даже после добавления объекта в словарь.Я читаю this и получаю nsdefaults в mutabledictionary (вместо изменяемого массива) и устанавливаю полученный словарь обратно в nsdefaults, но не уверен, в чем проблема.Любая помощь могла бы быть полезна.Спасибо.

Отредактировано: с this Я узнал, что мне нужно перемещать данные по изменчивому и неизменяемому словарю, и тогда он работал нормально!но все еще не в состоянии синхронизировать измененный NSMutableDictionary с NSUserDefaults.

-(BOOL)isAddedToFavorites:(NSString*)viewID {
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(favourites && [[favourites objectForKey:kFavouriteItemsKey] objectForKey:viewID])
return YES;

return NO;
}

-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType {
NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1];
[myMutableDictionary addEntriesFromDictionary:myDictionary];
[myMutableDictionary setObject:myObject forKey:myKey];


// Modified dictionary is not getting synced
[[NSUserDefaults standardUserDefaults]  setObject:myMutableDictionary  forKey:kFavouriteItemsKey];
[[NSUserDefaults standardUserDefaults]  synchronize];
}

Пробовал кодировать данные словаря в NSData, и теперь он работал после незначительных, но серьезных исправлений!

-(BOOL)isAddedToFavorites:(NSString*)viewID {

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:kFavouriteItemsKey];
NSDictionary *favourites = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

if(favourites && [favourites objectForKey:viewID])
    return YES;

return NO;
}

-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType {

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:kFavouriteItemsKey];
NSDictionary *myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1];
[myMutableDictionary addEntriesFromDictionary:myDictionary];
[myMutableDictionary setObject:viewType forKey:viewID];


NSData *newdata = [NSKeyedArchiver archivedDataWithRootObject:myMutableDictionary];
[[NSUserDefaults standardUserDefaults] setObject:newdata forKey:kFavouriteItemsKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}

Спасибо.

1 Ответ

2 голосов
/ 06 июля 2011

Вам нужно будет реализовать это для элементов вашего словаря:

Элемент в словаре реализует

@interface CommentItem : NSObject<NSCoding> {
    NSString *value;
}

Затем в реализации CommentItem предусмотрено два метода:

-(void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:value forKey:@"Value"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    self.value = [decoder decodeObjectForKey:@"Value"];
    return self;
}

Как указано на предоставленной ссылке @Irene.

...