ios - Coredata 获取托管对象,而对象的其他实例正在编辑导致崩溃

标签 ios objective-c core-data

我的应用(目标 iOS 6 及更高版本)有一个仪表板 View 、一个事件 TableView 和一个事件详细信息 View (更多,但它们与本主题无关)。

一旦用户进入仪表板,我就会运行事件更新。在此期间,如果需要,我会从核心数据中获取要更新的事件列表。 如果我在更新完成后打开表格 View ,一切都很好。但是当我在更新期间打开它时,应用程序崩溃了。 (在 TableView 中,我从核心数据(相同的对象)加载了一个事件列表。

错误是:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet。”

好吧,我认为这个错误的意思是错误的,因为当我不更新时该语句工作正常

获取请求:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Activity" inManagedObjectContext:managedObjectContext]];
[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"followedPlayer"]];
[fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"calendarDate" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"startTime" ascending:YES]]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY typeOfActivity IN %@", array]];

我个人认为问题是我有一个 Activity 的两个实例,而一个 Activity 正在编辑并且尚未在 managedobjectcontext 上调用保存(managedobjectcontext 是单例)。然后当调用保存时(或者当创建第二个对象时第一个对象有未保存的更改)应用程序崩溃。

我认为这个问题可以通过创建一个包含事件数组的单例类来解决,这样事件对象始终只有一个实例(或者只是在更新时阻止对 TableView 的访问)。但我想知道这是否可以用更好的方式完成。

我想到的方法是从核心数据中获取只读/非托管对象。这可以通过直接访问 sqlite 数据库来完成。但是在详细 View 中,我必须获取与事件有关系的其他对象,所以我认为这并不是真正的方法。

现在是否有人可以(以及如何)在不直接访问 sqlite 数据库的情况下获得只读托管对象或类似的东西,或者我应该只去一个包含事件的类,这样我就不会重复?

亲切的问候

萨伦印登

最佳答案

核心数据不是线程安全的。如果你在线程之间共享一个 NSManagedObjectContext 或者甚至一个 NSManagedObject ,你应该预料到很多像这样的麻烦。如需进一步阅读,请查看 Concurrency with Core Data .

同样从 iOS 5.0 开始,您可以设置 NSManagedObjectContextconcurrencyType。有three types .对于基于队列的类型,您需要确保您对 Core Data 所做的一切都是通过 performBlock:performBlockAndWait: 方法进行的。我因为忘记好几次而焦头烂额(它通常会通过死锁表现出来)。

关于ios - Coredata 获取托管对象,而对象的其他实例正在编辑导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15429366/

相关文章:

ios - 如何在 Firebase 中检索特定的 child ?

ios - 使 UITableView 部分标题与该部分的第一个单元格重叠

xcode - 将现有的 xcdatamodeld "folder"添加到 XCode

ios - 没有这样的模块 'Koloda"

ios - 检测首次在 iOS 中安装 NOT NSUserDefaults

iphone - 制作我自己的瓷砖系统导致滞后

ios - NSFetchedResultsController 未在委托(delegate)中调用controllerDidChangeContent

ios - 核心数据 : difference between backgroundContext and child context with privateQueueConcurrencyType?

ios - UIViewController 中的多个初始化步骤问题(不能使用多重继承)

ios - 将 session ID 传递给 GET Objective-C