【发布时间】:2011-03-17 22:18:43
【问题描述】:
我正在使用 Core Data 开发 iPhone 应用程序。所有用户数据都应与我们的服务器同步。为此,我创建了一个 NSOperation 的子类,它从我们的 Web 服务加载新数据并创建相应的托管对象。为了维护它们之间的关系,每个对象都使用一个 remoteID(它是关系服务器数据库的主键)传输。
假设有两个托管对象:Department > Employee。同步工作如下:
从服务器加载所有部门。对于每个部门:创建一个部门对象并设置其 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 传递了所有托管对象。
有什么想法吗?
【问题讨论】: