我有一个与Department
实体具有一对多关系的Employee
实体。在运行时,对于每个Department
对象,我想维护一个排序的Employee
对象数组(根据某些属性排序),它将用作各种视图对象中的模型。
从我读到的有两种方法来表示排序数组:
Rep1:定义一个获取的属性Department
(排序由Core Data完成);
Rep2:在 Department中维护一个实例变量sortedEmployees
(对象)(排序由我的代码完成)。NSArray
Employee
现在我真正的问题是,当应用程序启动时,我有大量的Departments
和Employees
要从持久存储中获取。我想在后台执行排序,以免阻塞 UI。
我尝试了几种方法,但最终都徒劳无功:
Method1(使用Rep1):在后台线程中(使用 an NSOperationQueue
),获取所有Departments
,然后执行每个获取的属性。Department
然后回到主线程,在主线程的托管对象上下文 ( MOC ) 中找到相应的对象(通过NSManagedObjectID)并使用 fetched 属性。Method1的问题:即使后台Department的fetch完成后,主线程Department对象中的fetched属性也没有填充,这意味着它在主线程Department中重新获取!这违背了后台获取的全部目的。假设所有 MOC 中都存在已获取的属性,我是否错了?
Method2(使用Rep2):在后台线程中(使用 an NSOperationQueue
),获取所有Departments
,然后计算每个人的sortedEmployees
数组。然后回到主线程,在主线程的MOC中找到对应的 Department 对象(通过NSManagedObjectID)并将前面提到的数组设置为这个对象。Method2 的问题:sortedEmployees
数组中的Employee
对象是属于后台线程的MOC的对象。当主线程稍后尝试访问它们时,会发生类似这样的崩溃,"NSManagedObject with ID ... has been invalidated."
这是因为每个线程都必须有自己的 MOC(及其关联的托管对象)。
那么,如果托管对象不能跨线程边界存在,那么如何在后台对托管对象进行排序呢?我错过了什么吗?