我目前正在做从外部服务器下载的项目。然后我进行 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 死锁
这些似乎是一个真正的痛苦@_@,所以如果你们中的任何人对如何做到这一点有一些其他的好主意,将得到极大的认可。谢谢大家!