Moje aplikacje używają [NSUserDefaults standardUserDefaults] jako szybkiej i brudnej bazy danych do przechowywania stanu o użytkowniku i samej aplikacji. Problem z NSUserDefaults polega na tym, że jego elastyczność pozwala na duży bałagan w dół, na przykład, gdy różne pliki ustawiają się i czytają różne klucze w słowniku na swój własny sposób. Nie możesz wymuszać reguł, możesz zepsuć kluczową nazwę itp.Który wzór do pakowania NSUserDefaults?
Napisałem prostą, singletonową "menedżersko-stylową" okładkę dla NSUserDefaults, która dba o ustawienie domyślnych wartości, gdy jest używana, ukrywa nazwa kluczy używanych do pobierania wartości i enkapsuluje pewną dodatkową logikę, na przykład kodowanie do NSData, podczas przechowywania i pobierania obiektów ze sklepu.
W tym momencie są to właściwości wspierane przez read/set accessor, ale coś mnie o to niepokoi i zastanawiam się, czy istnieje bardziej elegancki sposób na osiągnięcie tego samego rezultatu. Jest całkiem sporo podstaw, a składnia staje się nieco nieprzyjemna. Aby dać przykład:
.h:
@interface UserDefaultsManager: NSObject
+ (UserDefaultsManager *)sharedInstance;
@property (nonatomic, assign) NSInteger somethingImTracking;
@end
i .m:
NSString * const kSomethingImTracking= @"SomethingImTracking";
@implementation UserDefaultsManager
[...]
- (NSInteger)somethingImTracking
{
return [[[NSUserDefaults standardUserDefaults] objectForKey:kSomethingImTracking] intValue];
}
- (void)setSomethingImTracking:(NSInteger)somethingImTracking
{
[[NSUserDefaults standardUserDefaults] setInteger:somethingImTracking forKey:kSomethingImTracking];
}
i uzyskać dostęp do:
NSInteger foo = [UserDefaultsManager sharedInstance].somethingImTracking;
Robię * dokładnie * to samo w jednej z moich aplikacji, aby hermetyzować zestaw ustawień preferencji obsługiwanych przez moją aplikację. BTW - powinieneś zrobić static kSomethingImTracking, ponieważ jest on używany tylko w tym pliku .m. – rmaddy
@rmaddy Świetna wskazówka, dzięki! –
Możesz również chcieć, aby twoje 'setSomethingImTracking' było takie, że (a) rozsądne byłoby robienie' synchronizacji' po ustawieniu wartości; i (b) może zrobić 'willChangeValueForKey' przed ustawieniem wartości i' didChangeValueForKey' po ustawieniu, na wypadek gdyby kiedykolwiek zaimplementowałeś KVO w przyszłości. Zgadzam się jednak, że jest to dobry sposób na wyodrębnienie szczegółów ustawień 'NSUserDefaults'. – Rob