Saturday, February 1, 2014

Objective C. iOS. Сохранение объектов произвольных классов между запусками приложения

Чтобы не забыть, как я это сделала, и может кому будет тоже интересно и полезно.
Для этого нужен протокол NSCoding и класс NSUserDefaults.

Класс, объекты которого хочу сохранять между запусками моего приложения, должен реализовывать протокол NSCoding:

@interface Card : NSObject <NSCoding>
@property (nonatomic) int color;
@property (nonatomic) int shading;
@property (strong, nonatomic) NSString *symbol;
@property (nonatomic) int number;
@end
@implementation Card
#define COLOR_KEY @"color"
#define SHADING_KEY @"shading"
#define SYMBOL_KEY @"symbol"
#define NUMBER_KEY @"number"
- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if(self) {
        self.color = [decoder decodeIntForKey:COLOR_KEY];
        self.shading = [decoder decodeIntForKey:SHADING_KEY];
        self.symbol = [decoder decodeObjectForKey:SYMBOL_KEY];
        self.number = [decoder decodeIntForKey:NUMBER_KEY];
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeInt:self.color forKey:COLOR_KEY];
    [encoder encodeInt:self.shading forKey:SHADING_KEY];
    [encoder encodeInt:self.number forKey:NUMBER_KEY];
    [encoder encodeObject:self.symbol forKey:SYMBOL_KEY];
}
@end
Считывание и запись данных:
#define SAVED_CARD @"saved card"
-(Card *)read
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *archivedObject = [defaults objectForKey: SAVED_CARD];
    Card *card = (Card *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject];
    return card;
}
-(void)write:(Card *)card
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *archivedObject = [NSKeyedArchiver archivedDataWithRootObject:card];
    [defaults setValue:archivedObject forKey:ACTIVE_CARDS];
}

0 комментариев:

Post a Comment