2009-08-14 2 views
6

У меня есть словарь, хранящийся в NSUserDefaults, и мне нужно добавить/удалить элементы в этом словаре.Изменение объектов в NSUserDefaults без создания и повторной установки копий

Меня беспокоит, что для этого мне нужно создать изменяемую копию всего словаря, изменить один элемент и заменить весь словарь новой копией.

copy = [[defaults objectForKey:@"foo"] mutableCopy]; 
[copy setObject:… forKey:@"bar"]; 
[defaults setObject:copy forKey:@"foo"]; 

, и это связано с еще большим количеством копирования и повторной установки для объектов глубже в иерархии.

Есть ли лучший способ?

Я пытался использовать [defaults setValue:… forKeyPath:@"foo.bar"], но это не работает (объект не изменен).

ответ

5

Обычно я создаю пользовательский класс для хранения всех моих настроек приложения. Этот класс может загружать изменяемые копии из userDefaults один раз, при запуске программы, а затем обрабатывать все последовательные сохранения по пути:

MyPreferences.h

@interface MyPreferences 
{ 
    NSMutableDictionary allPrefs; 
} 
@property (readonly) NSMutableDictionary * allPrefs; 
- (void)load; 
- (void)save; 
@end 

MyPreferences.m

@implementation MyPreferences 
@synthesize allPrefs; 

- (id)init 
{ 
    if ((self = [super init]) == nil) { return nil; } 
    allPrefs = [[NSMutableDictionary alloc] initWithCapacity:0]; 
    return self; 
} 

- (void)dealloc 
{ 
    [allPrefs release]; 
    [super dealloc]; 
} 

- (void)load 
{ 
    // load all mutable copies here 
    [allPrefs setObject:[[defaults objectForKey:@"foo"] mutableCopy] 
       forKey:@"foo"]; 
    // ... 
} 

- (void)save 
{ 
    [defaults setObject:allPrefs forKey:@"app_preferences"]; 
} 

@end 

Я создаю экземпляр этого класса в своем делете делегата, а затем вызываю [myPrefs load], когда мое приложение запускается. Любые предпочтения изменились в то время как программа работает может быть изменен с помощью myPrefs, а затем сохраняется путем вызова [myPrefs save] по желанию:

MyPreferences * myPrefs = [myApplication myPrefs]; 
[myPrefs setObject:bar forKeyPath:@"allPrefs.foo.bar"]; 
[myPrefs save]; 

В качестве дополнительного бонуса, вы можете структурировать MyPreferences класс так, как вам нравится, в результате чего преимущества OO для всего набора предпочтений. Я показал простой способ, просто используя изменяемый словарь, но вы можете сделать каждое предпочтение в свойстве и выполнять предварительную/пост-обработку для более сложных объектов, например, NSColor.

 Смежные вопросы

  • Нет связанных вопросов^_^