1

我的应用程序(目标 iOS 6 和更高版本)有一个仪表板视图、一个活动表视图和一个活动详细信息视图(还有很多,但它们与本主题无关)。

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

错误是:由于未捕获的异常“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 的两个实例,而其中一个正在被编辑,并且尚未在 managedobjectcontext 上调用 save (managedobjectcontext 是一个单例)。然后,当调用 save 时(或者当第一个对象有未保存的更改而创建第二个对象时)应用程序崩溃。

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

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

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

亲切的问候

萨伦·印登

4

1 回答 1

1

Core Data不是线程安全的。如果您在线程之间共享一个NSManagedObjectContext甚至一个,您应该会遇到很多这样的麻烦。NSManagedObject如需进一步阅读,请查看Concurrency with Core Data

同样从 iOS 5.0 开始,您可以设置concurrencyType. NSManagedObjectContext三种类型。对于基于队列的类型,你需要确保你对 Core Data 所做的一切都是通过performBlock:andperformBlockAndWait:方法。我因忘记几次而被烧毁(它通常会通过死锁表现出来)。

于 2013-03-16T04:42:40.303 回答