iOS Magical Record сохранить на UIApplicationWillTerminateNotification

У меня есть приложение, которое хранит системные события в базе данных Core Data. Для сохранения я использую MagicalRecord.

Итак, в моем классе регистратора в init у меня есть:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDidFinishLaunchingNotification) name:UIApplicationDidFinishLaunchingNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleWillTerminateNotification) name:UIApplicationWillTerminateNotification object:nil];

В функциях дескриптора я храню простой объект со свойством text и timestamp:

- (void)handleDidFinishLaunchingNotification
{
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        DBMessage *dbMessage = [DBMessage createEntityInContext:localContext];
        dbMessage.text = @"Did finish launching";
        dbMessage.timestamp = [NSDate date];
    }];
}

- (void)handleWillTerminateNotification
{
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        DBMessage *dbMessage = [DBMessage createEntityInContext:localContext];
        dbMessage.text = @"Will terminate";
        dbMessage.timestamp = [NSDate date];
    }];
}

Когда я открываю и закрываю (без сбоев) приложение несколько раз, в моей БД я вижу записи «Завершил запуск» (более одной, поэтому я уверен, что приложение было закрыто, а не только перемещено в BG), но ни один из " Прекратится».

Я был бы менее удивлен, если бы событие запуска было пропущено, потому что я мог ожидать, что метод init будет вызван после публикации уведомления.

Что я могу сделать, чтобы сохранить события завершения?


person zalogatomek    schedule 14.05.2015    source источник


Ответы (1)


У меня есть ответ:

Похоже, когда приложение завершается, я не могу сохранить его в новом фоновом потоке. Но сохранение в текущем потоке работает нормально. Так что все, что мне нужно было сделать, это изменить метод сохранения, чтобы сохранить в текущем потоке, вызвав saveWithBlockAndWait: вместо saveWithBlock:

- (void)handleWillTerminateNotification
{
    [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
        DBMessage *dbMessage = [DBMessage createEntityInContext:localContext];
        dbMessage.text = @"Will terminate";
        dbMessage.timestamp = [NSDate date];
    }];
}

Теперь события успешно сохраняются в БД.

person zalogatomek    schedule 15.05.2015