antonio's blog

antonio's blog


Блог о всяком разном, связанном с разработкой ПО. Пишу редко, когда есть время и желание.

Anton Dobkin
Author

Share


Tags


Сохранение пользовательских настроек с помощью NSUserDefaults

Anton DobkinAnton Dobkin

Для хранения пользовательских настроек месжду запусками приложения в Cocoa имеется класс NSUserDefaults. Каждому приложению доступен общий экземпляр класса NSUserDefaults. Доступ к этум экземпляру осуществляется с помощью вызова статического метода standardUserDefaults:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  

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

NSUserDefaults может сохранять, в качестве значений параметров, основные типы: float, double, integer, boolean и объекты стандартных классов: NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary. Объекты классов NSArray, NSDictionary также должны содержать только объекты перечисленных классов. Если необходимо сохранить объекты других типов, используйте метод archivedDataWithRootObject: класса NSKeyedArchiver для получения экземпляра класса NSData NSUserDefaults хранит значения в базе данных параметров пользователя. База данных создается автоматически для каждого пользователя. Для того, чтобы постоянно не дергать базу данных при чтении и изменении параметров, NSUserDefaults использует кэширование. NSUserDefaults возвращаемые неизменяемые объекты, даже если вы устанавливали изменяемый объект в качестве значения.

Получение экземпляра NSUserDefaults

Как было сказано выше, общий экземпляр класса NSUserDefaults возвращает метод standardUserDefaults:. Если экземпляр не был ранее создан, то метод создает его со списком поиска, который состоит из следующих доменов:

Созданный объект инициализирован параметрами действительными только для текущего пользователя. Создать экземпляр класса также можно с помощью вызова методов alloc: и init: или initWithUser::

NSUserDefaults *defaults = [[NSUserDefaults alloc] init];  

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

Регистрация параметров по умолчанию

В момент запуска приложения необходимо зарегистрировать значения по умолчанию для тех параметров, значения которых должны быть действительными в любом случае. Когда в приложении вы запросите значение параметра, которое не было ранее задано, NSUserDefaults вернет зарегистрированное значение по умолчанию. Регистрация значений по умолчанию осуществляется с помощью метода registerDefaults:dictionary

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSMutableDictionary *defaultValues = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"Use3G"]; //... [defaultValues setObject:[NSNumber numberWithBool:YES] forKey:@"UseCache"]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues]; //... }

В метод необходимо передать словарь необходимых параметров и их значений, используемых по умолчанию. Параметры регистрируются в домене NSRegistrationDomain, который добавляется в конец списка поиска.

Сохранение параметров

Методы установки значений:

Пример сохранения параметров:

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool:YES forKey:@"UseCache"]; [defaults setObject:[NSDate dateWithTimeIntervalSinceNow:(3600 * 24 * 7)] forKey:@"CacheExpiresIn"];  

Чтение параметров

Методы чтения значений:

Поиск значений осуществляется в доменах списка поиска в порядке в котором они были добавлены в список. Получить все параметры из всех доменов поиска можно вызвав метод dictionaryRepresentation:. Метод возвращает словарь со всеми параметрами.

Пример чтения параметров:

NSUserDefaults = [NSUserDefaults standardUserDefaults]; if ([defaults boolForKey:@"Use3G"]) { // ... } else { //.. }  

Удаление параметров

Удаление параметров осуществляется с помощью метода removeObjectForKey:. Метод принимает единственный аргумент - название ключа.

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:@"Use3G"]; [defaults removeObjectForKey:@"UseCache"];  

Синхронизация

Синхронизация данных, хранящихся в кэше, с данными, хранящимися в базе данных параметров, происходит автоматически с определенными временными интервалами. Если данные необходимо синхронизировать немедленно, не дожидаясь пока это произойдет автоматически, необходимо вызвать метод synchronize:. Метод вернет YES, если данные были успешно синхронизированы, иначе NO.

Управление доменами

Домены разделяются на постоянные и не постоянные. Постоянные домены существуют между вызовами приложения. Непостоянные домены не сохраняются между вызовами приложения. Например, постоянным доменам являются NSGlobalDomain, домен равный идентификатору вашего приложения, а непостоянным - NSRegistrationDomain, NSArgumentDomain. Методы управления параметрами связанными с постоянными доменами:

Методы управления параметрами связанными с непостоянными доменами:

NSUserDefaults также позволяет использовать установленные параметры между приложениями. Если вам необходимо из приложения B получить доступ к параметрам приложения A, то в приложение B, в список поиска, вам необходимо добавить домен приложения A. Делается это с помощью метода addSuiteNamed:. Данные связанные с добавленным доменом доступны только для чтения. Метод принимает в качестве аргумента название домена. Обычно это идентификатор приложения. Для примера в своем приложении мы можем получить пути к базам данных iTunes:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
[defaults addSuiteNamed:@"com.apple.iApps"]; 
NSLog (@"Databases: %@", [defaults objectForKey:@"iTunesRecentDatabasePaths"]);  

Удалить домен из списка поиска можно с помощью метода removeSuiteNamed:. Метод принимает в качестве аргумента название удаляемого из списка поиска домена.

Уведомления

NSUserDefault посылает уведомление NSUserDefaultsDidChangeNotification когда происходит изменение значения параметра в постоянном домене. Объект уведомления - NSUserDefaults. Уведомление не содержит словарь userInfo. Пример использования уведомления:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(defaultsChanged:) name:NSUserDefaultsDidChangeNotification object:nil];  
}

- (void)defaultsChanged:(NSNotification *)notification { 
NSUserDefaults *defaults = (NSUserDefaults *)[notification object]; // используем 

}
Anton Dobkin
Author

Anton Dobkin

Comments