3

我有一个与Department实体具有一对多关系的Employee实体。在运行时,对于每个Department对象,我想维护一个排序的Employee对象数组(根据某些属性排序),它将用作各种视图对象中的模型。

从我读到的有两种方法来表示排序数组:

Rep1:定义一个获取的属性Department(排序由Core Data完成);

Rep2:在 Department中维护一个实例变量sortedEmployees(对象)(排序由我的代码完成)。NSArrayEmployee

现在我真正的问题是,当应用程序启动时,我有大量的DepartmentsEmployees要从持久存储中获取。我想在后台执行排序,以免阻塞 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(及其关联的托管对象)。

那么,如果托管对象不能跨线程边界存在,那么如何在后台对托管对象进行排序呢?我错过了什么吗?

4

1 回答 1

1

庇护,

你没有错过任何东西。您只需要将排序后的数组转换为新的 MOC。这是一个片段:

NSMutableArray *ma = [NSMutableArray arrayWithCapacity: array.count];

for (mo in array) {

    [ma addObject: [moc objectWithID: mo.objectID]];
}
return ma;

这将迁移您的阵列。据我了解,这是一个有效的过程。此外,您可以依赖行缓存来对属性进行高性能访问。

安德鲁

于 2011-11-08T22:26:25.370 回答