Обычно я делаю это, имея файл данных, в который я сохраняю вещи, когда мне нужно, и затем загружаю их обратно при инициализации объекта.Так что-то вроде этого:
@interface SessionStore
@property (nonatomic, copy) NSMutableArray *allSessions;
- (void)loadData;
- (void)saveData;
@end
static SessionStore *sharedInstance = nil;
static NSString *const kDataFilename = @"data.plist";
@implementation SessionStore
@synthesize allSessions = _allSessions;
#pragma mark -
+ (id)sharedInstance {
if (sharedInstance == nil)
sharedInstance = [[self alloc] init];
return sharedInstance;
}
#pragma mark -
- (id)init {
if ((self = [super init])) {
[self loadData];
}
return self;
}
#pragma mark -
- (void)loadData {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:kDataFilename];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {
NSMutableData *theData = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData];
self.allSessions = [[decoder decodeObjectForKey:@"allSessions"] mutableCopy];
[decoder finishDecoding];
}
if (!_allSessions) {
self.allSessions = [[NSMutableArray alloc] initWithCapacity:0];
}
}
- (void)saveData {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:kDataFilename];
NSMutableData *theData = [NSMutableData data];
NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:theData];
[encoder encodeObject:_allSessions forKey:@"allSessions"];
[encoder finishEncoding];
[theData writeToFile:path atomically:YES];
}
Затем, когда я захочу, я бы позвонил saveData
, чтобы сохранить данные обратно на диск.Это может происходить каждый раз, когда allSessions
изменяется, или только один раз, когда приложение завершает работу / переходит в фоновый режим.Это будет зависеть от того, как часто allSessions
изменяется и насколько важно обеспечить сохранение данных.
Имейте в виду, что код для синглтона ни в коем случае не лучший - ищите здесьStackOverflow для обоснования использования GCD dispatch_once
или аналогичного, если вы беспокоитесь о том, что sharedInstance
может быть расой.
Я думаю, что это лучше, чем ваш метод, потому что вы пытаетесь сериализовать весь объект-одиночка, а неего содержание, которое, я думаю, немного легче понять, что происходит, и тогда сам синглтон обрабатывает всю загрузку и сохранение, а не выливает ваш NSKeyedArchiver
в делегат приложения, как вы это сделали.