Core data 尝试一下NSManagedObjectContext保存是否有帮助?

Core data 尝试一下NSManagedObjectContext保存是否有帮助?,core-data,grand-central-dispatch,nsmanagedobjectcontext,Core Data,Grand Central Dispatch,Nsmanagedobjectcontext,我在后台线程中对数据库进行了一些非必要的更改(应用程序启动后不久),然后将它们合并到主上下文中。后台线程最终可能会进行很多更改,但我不希望上下文保存在后台处理过程中因某些验证错误或某些难以理解的核心数据异常而出错;特别是因为我将iCloud与核心数据一起使用,用户最终可能会失去关系。我只是希望应用程序继续运行,而不是抛出异常并退出 在这种情况下,在上下文保存周围有一个@try-@catch块有意义吗?执行此操作是否存在任何性能或内存管理问题 大概是这样的: @try { [con

我在后台线程中对数据库进行了一些非必要的更改(应用程序启动后不久),然后将它们合并到主上下文中。后台线程最终可能会进行很多更改,但我不希望上下文保存在后台处理过程中因某些验证错误或某些难以理解的核心数据异常而出错;特别是因为我将iCloud与核心数据一起使用,用户最终可能会失去关系。我只是希望应用程序继续运行,而不是抛出异常并退出

在这种情况下,在上下文保存周围有一个@try-@catch块有意义吗?执行此操作是否存在任何性能或内存管理问题

大概是这样的:

@try {
        [context performBlockAndWait: ^{
            NSError *error = nil;
            if ([context save:&error]){
                NSLog(@"Child context saved");

                [context.parentContext performBlockAndWait:^{
                    NSError *parentError = nil;
                    if ([context.parentContext save: &parentError]){
                        NSLog(@"Parent context saved");
                    }
                }];
            }
        }];
    } ....

我的应用程序面向数千名客户,因此,如果能提前知道这是否会导致比解决问题更多的问题,那就太好了

正在抛出哪些异常

由于
-[NSManagedObjectContext save:
使用了
NSError
out参数模式,我通常希望它不会抛出。然而,Cocoa的一般模式是,异常是“死亡”的,不被认为是可恢复的

在各种系统框架中都有抛出和捕获异常的地方(你可以通过在调试器中设置异常抛出断点看到)——我在看Cocoa绑定——但一般来说,如果一个异常冒泡到你的应用程序代码中,你已经“死在水里了”

执行此操作是否存在任何性能或内存管理问题

如今,对
@try/@catch/@finally
的性能惩罚非常小(情况并非总是如此)。需要确定的是内存管理的影响(这可能就是为什么在这个平台上异常通常是“死亡”的原因)。如果您使用ARC并通过抛出异常的方式退出作用域,ARC获取的保留将而不是释放。如上所述:

标准的Cocoa约定是,异常会向程序员发出信号 错误,不打算从中恢复。制作代码 默认情况下安全的异常会造成严重的运行时和代码大小 对通常不关心的代码的惩罚 例外安全。因此,默认情况下,ARC生成的代码在 例外情况,如果该过程将 反正马上就终止了。关心康复的项目 “从异常”应启用该选项


简而言之,在
@try/@catch
块中包装上下文保存操作可能没有意义。

除非您能够以安全的方式从异常中恢复,否则捕获它没有多大意义。