Правильный способ обработки ошибки сохранения данных ядра

В моем приложении я получаю кучу отчетов о сбоях SIGABRT (от конкретных пользователей) из-за этого кода обработки ошибок с базовыми данными:

NSError *error = nil;
if (![moc save:&error])
{
    if(error)
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

Есть ли лучший способ справиться с ошибкой сохранения данных ядра, чем завершить процесс с помощью функции abort()?

Ответ 1

Исходя из того, что ошибка a save не должна появляться в производстве, мой лучший совет - следовать аналогичной схеме.

NSError *error = nil;
if ([self.managedObjectContext save:&error] == NO) {
    NSAssert(NO, @"Save should not fail");
    [self showAlert];
}

- (void)showAlert {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Could Not Save Data"
                                                        message:@"There was a problem saving your data but it is not your fault. If you restart the app, you can try again. Please contact support ([email protected]) to notify us of this issue."
                                                       delegate:self
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    abort();
}

Кредиты идут на Matthew Morey, как описано в NSManagedObjectContext save error.

Мне очень нравится этот подход, поскольку он информирует пользователя о том, что произошло что-то плохое. В дополнение к этому я также создам файл журнала, который можно отправить по электронной почте для поддержки. В журнале вы ставите много информации, чтобы исследовать ошибку. Для этого, например, вы можете использовать CocoaLumberjack. Посмотрите также Журналы рассылки по NSSCreenCast.

Ответ 2

Итак, основные данные фактически предоставляют вам много информации о том, почему он не может сэкономить или почему валидация не удалась. Вы можете извлечь эту информацию и представить ее пользователю полезным способом и позволить ему/ей исправить ее (если мы говорим о пользовательских данных). Вот решение, которое я придумал: Основные данные iPhone "Производство" Обработка ошибок

Ответ 3

Используйте этот код, чтобы он вам помог

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            abort();
        }
    }
}