处理Core Data保存错误的正确方法

Nik*_* M. 14 core-data objective-c ios

在我的应用程序中,由于此核心数据保存错误处理代码,我收到了一堆SIGABRT崩溃报告(来自特定用户):

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

有没有比使用abort()终止进程更好的方法来处理核心数据保存错误?

Lor*_*o B 6

基于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 (support@domain.com) to notify us of this issue."
                                                       delegate:self
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    abort();
}
Run Code Online (Sandbox Code Playgroud)

NSManagedObjectContext保存错误中所述,积分转到Matthew Morey.

我真的很喜欢这种方法,因为它告诉用户发生了一些不好的事情.除此之外,我还将创建一个日志文件,可以通过电子邮件发送给支持人员.在日志中,您将提供尽可能多的信息来调查错误.例如,要实现这一点,您可以使用CocoaLumberjack.另请参阅NSSCreenCast的邮件日志.

  • 我不同意保存不应该在生产中失败.如果对象未通过验证或违反参照完整性规则,则保存可能会失败.人们不能总是在UI代码中实现对象验证.向用户显示出现问题然后中止并不能真正帮助用户.根据具体情况,程序应将_backback_上下文转换为_logical correct_状态,然后_replay_导致此错误的操作,假设这最终会成功,或者将被用户取消. (3认同)