2013-11-13 7 views
2

Я пытаюсь сохранить NSDictionary для своих NSUserDefualts.Сохранение NSDictionary (с пользовательскими классами) в NSUserDefaults

Словарь состоит из 3 различных пользовательских классов.

@interface PastOrder : NSObject <NSCoding> 
{ 
    NSDate *timeIn; 
    NSDate *timeOut; 
    NSString *status; 
    NSMutableArray *myItems; 
} 

@property (nonatomic, retain) NSDate *timeIn; 
@property (nonatomic, retain) NSDate *timeOut; 
@property (nonatomic, retain) NSString *status; 
@property (nonatomic, retain) NSMutableArray *myItems; 

@end 
@implementation PastOrder 

@synthesize timeIn, timeOut, status, myItems; 
#define PastOrderTimeInKey @"PastOrderTimeInKey" 
#define PastOrderTimeOutKey @"PastOrderTimeOutKey" 
#define PastOrderStatusKey @"PastOrderStatusKey" 
#define PastOrderMyItemsKey @"PastOrderMyItemsKey" 

-(id)initWithCoder:(NSCoder*)decoder 
{ 
    self = [super init]; 
    if(self) 
    { 
     self.timeIn = [decoder decodeObjectForKey:PastOrderTimeInKey]; 
     self.timeOut = [decoder decodeObjectForKey:PastOrderTimeOutKey]; 
     self.status = [decoder decodeObjectForKey:PastOrderStatusKey]; 
     self.myItems = [decoder decodeObjectForKey:PastOrderMyItemsKey]; 
    } 
    return self; 
} 
-(void)encodeWithCoder:(NSCoder*)encoder 
{ 
    [encoder encodeObject:self.timeIn forKey:PastOrderTimeInKey]; 
    [encoder encodeObject:self.timeOut forKey:PastOrderTimeOutKey]; 
    [encoder encodeObject:self.status forKey:PastOrderStatusKey]; 
    [encoder encodeObject:self.myItems forKey:PastOrderMyItemsKey]; 
} 
-(void)dealloc 
{ 
    self.timeIn = nil; 
    self.timeOut = nil; 
    self.status = nil; 
    self.myItems = nil; 
} 
@end 

@interface PastOrderItem : NSObject <NSCoding> 
{ 
    NSNumber *itemID; 
    NSString *status; 
    NSMutableArray *itemChoices; 
} 
@property (nonatomic, retain) NSNumber *itemID; 
@property (nonatomic, retain) NSString *status; 
@property (nonatomic, retain) NSMutableArray *itemChoices; 
@end 
@implementation PastOrderItem 

@synthesize itemID,status,itemChoices; 
#define PastOrderItemItemIDKey @"PastOrderItemItemIDKey" 
#define PastOrderItemStatusKey @"PastOrderItemStatusKey" 
#define PastOrderItemItemChoicesKey @"PastOrderItemItemChoicesKey" 
-(id)initWithCoder:(NSCoder*)decoder 
{ 
    self = [super init]; 
    if(self) 
    { 
     self.itemID = [decoder decodeObjectForKey:PastOrderItemItemIDKey]; 
     self.itemChoices = [decoder decodeObjectForKey:PastOrderItemItemChoicesKey]; 
     self.status = [decoder decodeObjectForKey:PastOrderItemStatusKey]; 
    } 
    return self; 
} 
-(void)encodeWithCoder:(NSCoder*)encoder 
{ 
    [encoder encodeObject:self.itemID forKey:PastOrderItemItemIDKey]; 
    [encoder encodeObject:self.itemChoices forKey:PastOrderItemItemChoicesKey]; 
    [encoder encodeObject:self.status forKey:PastOrderItemStatusKey]; 
} 
-(void)dealloc 
{ 
    self.itemID = nil; 
    self.itemChoices = nil; 
    self.status = nil; 
} 
@end 

@interface PastOrderItemChoice : NSObject <NSCoding> 
{ 
    NSNumber *modifierID; 
    NSNumber *modifierChoice; 
} 
@property (nonatomic, retain) NSNumber *modifierID; 
@property (nonatomic, retain) NSNumber *modifierChoice; 
@end 
@implementation PastOrderItemChoice 

@synthesize modifierID, modifierChoice; 
#define PastOrderItemChoiceModifierIDKey @"PastOrderItemChoiceModifierIDKey" 
#define PastOrderItemChoiceModifierChoiceKey @"PastOrderItemChoiceModifierChoiceKey" 
-(id)initWithCoder:(NSCoder*)decoder 
{ 
    self = [super init]; 
    if(self) 
    { 
     self.modifierID = [decoder decodeObjectForKey:PastOrderItemChoiceModifierIDKey]; 
     self.modifierChoice = [decoder decodeObjectForKey:PastOrderItemChoiceModifierChoiceKey]; 
    } 
    return self; 
} 
-(void)encodeWithCoder:(NSCoder*)encoder 
{ 
    [encoder encodeObject:self.modifierID forKey:PastOrderItemChoiceModifierIDKey]; 
    [encoder encodeObject:self.modifierChoice forKey:PastOrderItemChoiceModifierChoiceKey]; 
} 
-(void)dealloc 
{ 
    self.modifierID = nil; 
    self.modifierChoice = nil; 

} 
@end 

Это три класса, которые будут находиться внутри этого NSDictionary. Вот как я загружаю и сохраняю его.

-(void)SavePrefs 
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSData* data=[NSKeyedArchiver archivedDataWithRootObject:self.myDictionary]; 
    [prefs setObject:data forKey:@"SavedOrders"]; 
    [prefs synchronize]; 
} 
- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"SavedOrders"]; 
     self.myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

     } 
    return self; 
} 

Я экспериментировал с кодом немного, и лучше меня далеко, что при сохранении словаря, это 135 байт, то же самое, как когда я загрузил его, но он все еще не заполнить словарь вверх. Поэтому я в недоумении.

ответ

1

Ваш код кажется хорошим. Я не могу найти ошибку так попытайтесь линии изменения:

self.myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

в

id unknownObject = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
NSLog(@"%@",[unknownObject class]); 

И смотрите @ консоли. Возможно, вам также следует попробовать выполнить кастинг, если на выходе будет словарь. Поэтому постарайтесь, чтобы изменить это:

self.myDictionary = (NSDictionary*)[NSKeyedUnarchiver unarchiveObjectWithData:data]; 

EDIT

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"object1",@"key1",@"object2",@"key2",@"object3",@"key3", nil]; 
NSLog(@"before: %@",dictionary); 
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:dictionary]; 
NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData]; 
NSLog(@"after: %@",myDictionary); 

Выход:

2013-11-13 14:32:31.369 DemoM[175:60b] before: { 
    key1 = object1; 
    key2 = object2; 
    key3 = object3; 
} 
2013-11-13 14:32:31.372 DemoM[175:60b] after: { 
    key1 = object1; 
    key2 = object2; 
    key3 = object3; 
} 
+1

при архивировании я думал, что вы должны были иметь закодировать с кодером, а также осуществлять инициализации с метод инициализатора кодера во всех кодируемых/декодируемых объектах –

+0

Не думаю, что так. Я просто пишу образец кода и отлично работаю. – Kuba

+0

alrighty, если он работает, это работает: D –

Смежные вопросы