Home

Awesome

AppSettings

AppSettings is a simple tool that allows automatic serialization and deserialization of objects to NSDictionary with writing and reading them from NSUserDefaults. Originally created to simply manage app settings in NSUserDefaults.

Abstract

When you want to persist your custom object to e.g. NSUserDefaults you have to serialize it using NSCoding and NSKeyedArchiver. It's not hard but it's time consuming and Xcode does not make it easier by generating some kind of default encoding and decoding method stubs. It becomes real pain in the ass when you have to manually serialize all properties.

On the other hand it is very convenient to have a model object for your app settings instead of just writing values for keys in NSUserDefaults. Your can use code completion, compiler warns you when you make a typo and you don't have to remember all the strings for keys in your custom dictionary.

So why not to write a serializer that converts your custom object with properties to NSDictionary and saves it under key of your class name? AppSettings does exactly that! :)

How to use it?

All you have to do is to create your own class that inherits from AppSettings. Fields you want to save have to be declared as properties (@property) in your .h file, just like in any other object. When you are done and your object is ready you call save to persist your object. When you want to load your previously saved object you call - (id)load which returns instance of AppSettings subclass. That's it! :)

Example usage:

#import "AppSettings.h"
#import "MyNestedSettings.h"

@interface MySettings : AppSettings

@property (nonatomic, strong) NSDate *exampleDate;
@property (nonatomic, strong) NSString *exampleString;
@property (nonatomic, strong) NSNumber *exampleNumber;
@property (nonatomic, assign) int exampleInt;
@property (nonatomic, assign) BOOL exampleBool;

@end
MySettings *mySettings = [[MySettings alloc] init];
mySettings.exampleDate = [NSDate date];
[mySettings save];
MySettings *mySettings = [MySettings load];

Your settings are saved under MySettings key and look similar to this:

    MySettings =     {
        exampleBool = 1;
        exampleDate = "2013-12-08 11:26:56 +0000";
        exampleInt = 456;
        exampleNumber = 123;
        exampleString = "Example string \U0105\U0119\U015b\U0107";
    };

Additional methods

You can play with other methods that are implemented in AppSettings class:

- (id)initWithDictionary:(NSDictionary*)dictionaryOfPropertiesAndValues;

- (NSArray*)propertiesNames;
- (NSDictionary*)dictionaryOfPropertiesAndValues;

- (BOOL)save;
- (BOOL)saveUnderKey:(NSString*)mainKey;

+ (id)load;
+ (id)loadFromKey:(NSString*)mainKey;

You can e.g. extract dictionary of properties and values and handle it by yourself or save your settings under different key.

You can also see the AppSettingsTests.m file to see each method in action.

Nested objects

Yes, you can have nested objects. Just declare them also as subclasses of AppSettings and use as properties in your main settings class. See MySettings.h and MyNestedSettings.h files in test section.

#import "AppSettings.h"
#import "MyNestedSettings.h"

@interface MySettings : AppSettings

@property (nonatomic, strong) NSDate *exampleDate;
@property (nonatomic, strong) NSString *exampleString;
@property (nonatomic, strong) NSNumber *exampleNumber;
@property (nonatomic, assign) int exampleInt;
@property (nonatomic, assign) BOOL exampleBool;

@property (nonatomic, strong) MyNestedSettings *myNestedSettings;

@end
#import "AppSettings.h"

@interface MyNestedSettings : AppSettings

@property (nonatomic, strong) NSString *nestedSettingsString;

@end

Your saved settings with nested objects now look similar to this:

    MySettings =     {
        exampleBool = 1;
        exampleDate = "2013-12-08 11:26:56 +0000";
        exampleInt = 456;
        exampleNumber = 123;
        exampleString = "Example string \U0105\U0119\U015b\U0107";
        myNestedSettings =         {
            nestedSettingsString = "nested example string";
        };
    };

Answering some questions

License

AppSettings is available under the MIT license. See the LICENSE file for more info.