在枚举核心数据中的问题时修复变异

时间:2012-11-21 01:54:23

标签: ios multithreading core-data

我目前正在做从外部服务器下载的项目。然后我做JSON序列化,然后将其保存到核心数据数据库。我收到错误

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x69c8a10> was mutated while being enumerated.

指向我用作查询数据库的一部分的代码行:

NSArray *matches = [context executeFetchRequest:request error:&error];

我在查询数据库时使用的完整代码:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
request.predicate = [NSPredicate predicateWithFormat:@"product_id = %@", [productInfo  objectForKey:@"id"]];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];

我只传递包含单个UIManagedDocument的对象。关于同样的问题,我在SO中经历了不同的帖子,很多人指出这是一个线程问题。

大多数情况下,他们建议有一种父子关系,它将在不同的线程上;一个上下文将负责下载内容,另一个将在将负责UI的主线程上。然后,稍后将合并完成的更改。我们已经开始启动它了,但这个提议的解决方案似乎有很多问题,正如Whitney Young在post中提到的那样。这些问题是,我引用

  • 子语境阻止祖先
  • 对父上下文进行更改可能会很慢
  • 在子上下文中获取结果是错误的
  • 无法访问未保存对象的子上下文中的关系
  • 当父上下文发生更改时,不会对排序进行排序
  • NSFetchedResultsController死锁

这些似乎是一个真正的痛苦@ _ @,所以如果你们中的任何人有一些关于如何做到这一点的其他好主意将会得到极大的认可。谢谢那些人!

0 个答案:

没有答案