iphone – 核心数据executeFetchRequest抛出NSGenericException(集合在枚举时被突变)

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

假设有两个托管对象:Department< - >>雇员.同步工作如下:

>从服务器加载所有部门.对于每个部门:创建一个Department对象并设置其remoteID.
>从服务器加载所有员工.对于每个员工:创建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,并使用常规的persistentStoreCoordinator …
之后它工作得很好!
翻译自:https://stackoverflow.com/questions/3281552/core-data-executefetchrequest-throws-nsgenericexception-collection-was-mutated

转载注明原文:iphone – 核心数据executeFetchRequest抛出NSGenericException(集合在枚举时被突变)