-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCCLDefaults.m
174 lines (133 loc) · 5.44 KB
/
CCLDefaults.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
//
// CCLDefaults.m
// Cocode
//
// Created by Kyle Fuller on 12/08/2012.
// Copyright (c) 2012-2013 Cocode. All rights reserved.
//
#import "CCLDefaults.h"
NSString * const CCLStoreVersionKey = @"CCLStoreVersion";
@implementation CCLDefaults
- (instancetype)init {
return [self initWithUserDefaults:[NSUserDefaults standardUserDefaults] ubiquitousKeyValueStore:[NSUbiquitousKeyValueStore defaultStore] bundle:[NSBundle mainBundle]];
}
- (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults ubiquitousKeyValueStore:(NSUbiquitousKeyValueStore *)ubiquitousKeyValueStore bundle:(NSBundle *)bundle {
NSParameterAssert(userDefaults != nil);
NSParameterAssert(bundle != nil);
if (self = [super init]) {
_userDefaults = userDefaults;
_ubiquitousKeyValueStore = ubiquitousKeyValueStore;
_bundle = bundle;
NSDictionary *defaults = [self defaultsDictionary];
if (defaults != nil) {
[userDefaults registerDefaults:defaults];
}
if (ubiquitousKeyValueStore) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateKVStoreItems:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:ubiquitousKeyValueStore];
[ubiquitousKeyValueStore synchronize];
}
if ([self automaticallyUpgradesStore]) {
[self upgradeStore];
}
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:_ubiquitousKeyValueStore];
if ([[self userDefaults] synchronize] == NO) {
NSLog(@"CLLDefaults: Failed to synchronize user defaults");
}
}
- (NSString *)defaultsFile {
NSString *defaultsFile = [_bundle pathForResource:@"CCLDefaults" ofType:@"plist"];
return defaultsFile;
}
- (NSDictionary *)defaultsDictionary {
NSString *defaultsFile = [self defaultsFile];
NSDictionary *defaults;
if (defaultsFile) {
defaults = [NSDictionary dictionaryWithContentsOfFile:defaultsFile];
}
return defaults;
}
- (void)updateKVStoreItems:(NSNotification*)notification {
NSDictionary *userInfo = [notification userInfo];
NSNumber *reasonForChange = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangeReasonKey];
if (reasonForChange) {
NSInteger reason = [reasonForChange integerValue];
if ((reason == NSUbiquitousKeyValueStoreServerChange) || (reason == NSUbiquitousKeyValueStoreInitialSyncChange)) {
NSArray *changedKeys = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangedKeysKey];
NSUserDefaults *userDefaults = [self userDefaults];
for (NSString *key in changedKeys) {
id value = [_ubiquitousKeyValueStore objectForKey:key];
[self willChangeValueForKey:key];
[userDefaults setObject:value forKey:key];
[self didChangeValueForKey:key];
}
}
}
}
- (BOOL)automaticallyUpgradesStore {
return YES;
}
- (void)upgradeStore {
NSUserDefaults *userDefaults = [self userDefaults];
NSNumber *versionNumber = [userDefaults objectForKey:CCLStoreVersionKey];
NSDictionary *infoDictionary = [_bundle infoDictionary];
NSString *versionString = [infoDictionary valueForKey:@"CFBundleVersion"];
NSUInteger currentVersion = [@([versionString integerValue]) unsignedIntegerValue];
if (versionNumber) {
NSUInteger version = [versionNumber unsignedIntegerValue];
if (version != currentVersion) {
[self upgradeFromVersion:version toVersion:currentVersion];
}
} else {
[self upgradeFromVersion:0 toVersion:currentVersion];
}
[userDefaults setObject:@(currentVersion) forKey:CCLStoreVersionKey];
}
- (void)upgradeFromVersion:(NSUInteger)existingVersion toVersion:(NSUInteger)newVersion {
NSLog(@"CCLDefaults: Upgrading from version %lu to %lu", (unsigned long)existingVersion, (unsigned long)newVersion);
}
- (void)setObject:(id)object forKey:(NSString *)key {
[self willChangeValueForKey:key];
[[self userDefaults] setObject:object forKey:key];
[[self ubiquitousKeyValueStore] setObject:object forKey:key];
[self didChangeValueForKey:key];
}
- (void)removeObjectForKey:(NSString *)key {
[[self userDefaults] removeObjectForKey:key];
[[self ubiquitousKeyValueStore] removeObjectForKey:key];
}
#pragma mark - Getters
- (id)objectForKey:(NSString *)key {
return [[self userDefaults] objectForKey:key];
}
- (id)objectOfClass:(Class)aClass forKey:(NSString *)key {
id value = [[self userDefaults] objectForKey:key];
id object;
if ([value isKindOfClass:aClass]) {
object = value;
}
return object;
}
- (BOOL)boolForKey:(NSString *)key {
return [[self userDefaults] boolForKey:key];
}
#pragma mark - Object subscripting
- (id)objectForKeyedSubscript:(id <NSCopying>)key {
id object;
if ([(NSObject *)key isKindOfClass:[NSString class]]) {
object = [[self userDefaults] objectForKey:(NSString *)key];
}
return object;
}
- (void)setObject:(id)object forKeyedSubscript:(id <NSCopying>)key {
if ([(NSObject *)key isKindOfClass:[NSString class]]) {
[self willChangeValueForKey:(NSString *)key];
[[self userDefaults] setObject:object forKey:(NSString *)key];
[[self ubiquitousKeyValueStore] setObject:object forKey:(NSString *)key];
[self didChangeValueForKey:(NSString *)key];
}
}
@end