iphone - 核心数据executeFetchRequest抛出NSGenericException(枚举时集合发生了变化)

标签 iphone core-data

我正在使用 Core Data 开发 iPhone 应用程序。所有用户数据应与我们的服务器同步。为此,我创建了 NSOperation 的子类,它从我们的 Web 服务加载新数据并创建相应的托管对象。为了维护它们之间的关系,每个对象都使用一个remoteID(这是关系服务器DB的主键)进行传输。

假设有两个托管对象:Department <-->> Employee。同步的工作原理如下:

  1. 从服务器加载所有部门。对于每个部门:创建一个 Department 对象并设置其 RemoteID。

  2. 从服务器加载所有员工。对于每个员工:创建 Employee 对象,获取相关部门(通过 RemoteID)并将其分配给员工。

获取部门会导致以下异常:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x69c8a10> was mutated while being enumerated.<CFBasicHash 0x69c8a10 [0x2d6d380]>{type = mutable set, count = 1424, 
entries => <A list of all newly created entities>

*** Call stack at first throw:
0 CoreFoundation  0x02d04919 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x02e525de objc_exception_throw + 47
2 CoreFoundation  0x02d043d9 __NSFastEnumerationMutationHandler + 377
3 CoreData        0x026225d0 -[NSManagedObjectContext executeFetchRequest:error:] + 4400
4 myApp           0x00059de4 +[AppFactory departmentWithRemoteID:inManagedObjectContext:] + 259

并不是每次都会抛出异常。将代码移至主线程即可解决问题。我不知道出了什么问题。我在同步线程中创建了一个新的 NSManagedObjectContaxt 并通过其 NSManagedObjectID 传递了所有托管对象。

有什么想法吗?

最佳答案

我也遇到了同样的问题... 它已解决,因为我使用的是在后台线程的主线程上创建的 ManagedObjectContext。 解决方案是在后台线程上创建一个不同的 ManagedObjectContext,并使用常规的 persistenceStoreCoordinator... 之后一切正常!

关于iphone - 核心数据executeFetchRequest抛出NSGenericException(枚举时集合发生了变化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281552/

相关文章:

ios - 如何在 iPhone 的手势识别器中获取原始附加 View ?

iphone - 更改 iPhone 键盘上的 "enter"键文本?

iphone - iPhone 中的电子书阅读器 : alternatives to Web view

iphone - 我应该在每个 View 中都有一个 NSFetchedResultsController 吗?

ios - 使用 CoreData 和捆绑的 SQLite 数据库?

iphone - 如何禁用 iPhone 键盘上的 Go 按钮

iPhone 4 陷阱最大宽度 :480px media queries

ios - 如何在 Objective-C 中更新核心数据值

ios - 调用核心数据中的单个特定行

ios - 核心数据不返回完整对象,数据 : <fault>