Changeset 3192

Show
Ignore:
Timestamp:
08/15/05 13:37:27 (3 years ago)
Author:
morris
Message:

Support loading from a custom defaults domain

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ZankaAdditions/trunk/ZASettings.h

    r3123 r3192  
    2828 
    2929@interface ZASettings : ZAObject { 
     30        NSString                                                *_identifier; 
    3031        NSMutableDictionary                             *_settings; 
     32        id                                                              _defaults; 
    3133        NSRecursiveLock                                 *_lock; 
    3234} 
    3335 
    3436 
     37+ (void)loadWithIdentifier:(NSString *)identifier; 
    3538+ (NSDictionary *)defaults; 
    3639 
  • ZankaAdditions/trunk/ZASettings.m

    r3190 r3192  
    3232 
    3333+ (id)_settings; 
     34+ (id)_settingsWithIdentifier:(NSString *)identifier; 
     35- (id)_initWithIdentifier:(NSString *)identifier; 
    3436 
    3537- (void)_setObject:(id)object forKey:(id)key; 
    3638- (id)_objectForKey:(id)key; 
    3739 
     40- (void)_synchronize; 
     41- (void)_synchronizeLocked; 
     42 
    3843@end 
    3944 
     
    4247 
    4348+ (id)_settings { 
    44         static id sharedSettings; 
     49        return [self _settingsWithIdentifier:NULL]; 
     50
     51 
     52 
     53 
     54+ (id)_settingsWithIdentifier:(NSString *)identifier { 
     55        static id       sharedSettings; 
    4556 
    4657        if(!sharedSettings) 
    47                 sharedSettings = [[self alloc] init]; 
     58                sharedSettings = [[self alloc] _initWithIdentifier:identifier]; 
    4859 
    4960        return sharedSettings; 
     
    5263 
    5364 
     65- (id)_initWithIdentifier:(NSString *)identifier { 
     66        NSDictionary    *defaultValues; 
     67        NSString                *key; 
     68        NSEnumerator    *enumerator; 
     69        BOOL                    synchronize = NO; 
     70        id                              object; 
     71 
     72        self = [super init]; 
     73 
     74        _lock = [[NSRecursiveLock alloc] init]; 
     75        _settings = [[NSMutableDictionary alloc] init]; 
     76         
     77        if(identifier) { 
     78                _identifier = [identifier retain]; 
     79                _defaults = [[[NSUserDefaults standardUserDefaults] persistentDomainForName:_identifier] mutableCopy]; 
     80 
     81                if(!_defaults) 
     82                        _defaults = [[NSMutableDictionary alloc] init]; 
     83        } else { 
     84                _defaults = [NSUserDefaults standardUserDefaults]; 
     85        } 
     86         
     87        defaultValues = [[self class] defaults]; 
     88        enumerator = [defaultValues keyEnumerator]; 
     89 
     90        while((key = [enumerator nextObject])) { 
     91                object = [_defaults objectForKey:key]; 
     92 
     93                if(!object) { 
     94                        object = [defaultValues objectForKey:key]; 
     95 
     96                        if([object isKindOfPropertyListSerializableClass]) 
     97                                [_defaults setObject:object forKey:key]; 
     98                        else 
     99                                [_defaults setObject:[NSArchiver archivedDataWithRootObject:object] forKey:key]; 
     100                         
     101                        synchronize = YES; 
     102                } 
     103 
     104                if([object isKindOfClass:[NSData class]]) { 
     105                        object = [NSUnarchiver unarchiveObjectWithData:object]; 
     106 
     107                        if(object) 
     108                                [_settings setObject:object forKey:key]; 
     109                } else { 
     110                        [_settings setObject:object forKey:key]; 
     111                } 
     112        } 
     113         
     114        if(synchronize) 
     115                [self _synchronize]; 
     116 
     117        return self; 
     118} 
     119 
     120 
     121 
    54122#pragma mark - 
    55123 
    56124- (void)_setObject:(id)object forKey:(id)key { 
    57         NSUserDefaults          *defaults; 
    58  
    59         defaults = [NSUserDefaults standardUserDefaults]; 
     125        [_lock lock]; 
    60126 
    61127        if([object isKindOfPropertyListSerializableClass]) 
    62                 [defaults setObject:object forKey:key]; 
     128                [_defaults setObject:object forKey:key]; 
    63129        else 
    64                 [defaults setObject:[NSArchiver archivedDataWithRootObject:object] forKey:key]; 
    65  
    66         [_lock lock]; 
     130                [_defaults setObject:[NSArchiver archivedDataWithRootObject:object] forKey:key]; 
     131 
    67132        [_settings setObject:object forKey:key]; 
     133         
    68134        [_lock unlock]; 
    69135 
    70         [defaults performSelectorOnce:@selector(synchronize) withObject:NULL afterDelay:0.1]; 
     136        [self performSelectorOnce:@selector(_synchronizeLocked) withObject:NULL afterDelay:1.0]; 
    71137} 
    72138 
     
    83149} 
    84150 
     151 
     152 
     153#pragma mark - 
     154 
     155- (void)_synchronize { 
     156        NSUserDefaults          *defaults; 
     157         
     158        defaults = [NSUserDefaults standardUserDefaults]; 
     159         
     160        if(_identifier) { 
     161                [defaults removePersistentDomainForName:_identifier]; 
     162                [defaults setPersistentDomain:_defaults forName:_identifier]; 
     163        } 
     164         
     165        [defaults synchronize]; 
     166} 
     167 
     168 
     169 
     170- (void)_synchronizeLocked { 
     171        [_lock lock]; 
     172        [self _synchronize]; 
     173        [_lock unlock]; 
     174} 
     175 
    85176@end 
    86177 
     
    88179 
    89180@implementation ZASettings 
     181 
     182+ (void)loadWithIdentifier:(NSString *)identifier { 
     183        (void) [[self class] _settingsWithIdentifier:identifier]; 
     184} 
     185 
     186 
    90187 
    91188+ (NSDictionary *)defaults { 
     
    95192 
    96193 
    97 - (id)init { 
    98         NSUserDefaults  *defaults; 
    99         NSDictionary    *defaultValues; 
    100         NSString                *key; 
    101         NSEnumerator    *enumerator; 
    102         id                              object; 
    103  
    104         self = [super init]; 
    105  
    106         _settings = [[NSMutableDictionary alloc] init]; 
    107         _lock = [[NSRecursiveLock alloc] init]; 
    108  
    109         defaultValues = [[self class] defaults]; 
    110         defaults = [NSUserDefaults standardUserDefaults]; 
    111         enumerator = [defaultValues keyEnumerator]; 
    112  
    113         while((key = [enumerator nextObject])) { 
    114                 object = [defaults objectForKey:key]; 
    115  
    116                 if(!object) { 
    117                         object = [defaultValues objectForKey:key]; 
    118  
    119                         if([object isKindOfPropertyListSerializableClass]) 
    120                                 [defaults setObject:object forKey:key]; 
    121                         else 
    122                                 [defaults setObject:[NSArchiver archivedDataWithRootObject:object] forKey:key]; 
    123                 } 
    124  
    125                 if([object isKindOfClass:[NSData class]]) { 
    126                         object = [NSUnarchiver unarchiveObjectWithData:object]; 
    127  
    128                         if(object) 
    129                                 [_settings setObject:object forKey:key]; 
    130                 } 
    131                 else { 
    132                         [_settings setObject:object forKey:key]; 
    133                 } 
    134         } 
    135  
    136         return self; 
    137 } 
    138  
    139  
    140  
    141194#pragma mark - 
    142195