1

我目前正在做从外部服务器下载的项目。然后我进行 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在这篇文章中所说,我们已经在启动它,但是这个提议的解决方案似乎有很多问题。这些问题是,我引用

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

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

4

0 回答 0