Sorting 核心数据背景排序

Sorting 核心数据背景排序,sorting,core-data,background,nsmanagedobjectcontext,fetched-property,Sorting,Core Data,Background,Nsmanagedobjectcontext,Fetched Property,我有一个部门实体,它与员工实体有一对多的关系。在运行期间,对于每个部门对象,我希望维护一个排序的员工对象数组(根据某些属性排序),该数组将用作各种视图对象中的模型 据我所知,有两种方法可以表示排序数组: Rep1:在部门中定义获取的属性(按核心数据排序) Rep2:维护部门中的实例变量sortedEmployees(员工对象的NSArray)(排序由我的代码完成) 现在,我真正的问题是,当应用程序启动时,我有大量的部门和员工要从持久性商店取回。我想在后台执行排序,以免阻塞UI 我尝试过几种方法,

我有一个
部门
实体,它与
员工
实体有一对多的关系。在运行期间,对于每个
部门
对象,我希望维护一个排序的
员工
对象数组(根据某些属性排序),该数组将用作各种视图对象中的模型

据我所知,有两种方法可以表示排序数组:

Rep1:在
部门
中定义获取的属性(按核心数据排序)

Rep2:维护部门中的实例变量
sortedEmployees
员工
对象的
NSArray
)(排序由我的代码完成)

现在,我真正的问题是,当应用程序启动时,我有大量的
部门
员工
要从持久性商店取回。我想在后台执行排序,以免阻塞UI

我尝试过几种方法,但最终都是徒劳的:

Method1(使用Rep1):在后台线程中(使用
NSOperationQueue
),获取所有
部门,然后执行每个部门获取的属性。然后回到主线程,在主线程的托管对象上下文(MOC)(通过NSManagedObjectID)中找到相应的
Department
对象,并使用fetched属性。 Method1的问题:即使在后台部门的获取完成后,主线程的Department对象中的fetched属性也没有填充,这意味着它是在主线程部门中重新获取的!这违背了后台获取的全部目的。我是否错误地认为一个已获取的属性,一旦获取,就存在于所有MOC中

Method2(使用Rep2):在后台线程中(使用
NSOperationQueue
),获取所有
部门,然后计算每个部门的
sortedEmployees
数组。然后回到主线程,在主线程的MOC(通过NSManagedObjectID)中找到相应的部门对象,并将上述数组设置为此对象。 方法2存在问题:
sortedEmployees
数组中的对象是属于后台线程的MOC
Employee
对象。当主线程稍后尝试访问它们时,会发生崩溃,例如
“ID为…的NSManagedObject已无效。”
这是因为每个线程必须有自己的MOC(及其关联的托管对象)

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

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

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

for (mo in array) {

    [ma addObject: [moc objectWithID: mo.objectID]];
}
return ma;
这将迁移您的阵列。据我所知,这是一个有效的过程。此外,您还可以依靠行缓存对属性进行高性能访问


安德鲁

谢谢。您能否详细说明依赖行缓存的含义?什么行缓存?另外,我应该在哪个线程中执行前面提到的阵列迁移?在主线程的情况下,当您访问mo.objectID时,“mo”是否会失效并因此出错?在后台线程的情况下,访问[moc objectWithID:…]是否会有问题,因为moc属于主线程?PIU,行缓存由持久存储协调器维护。这是一种自动性能优化。您不需要维护它--核心数据需要维护。我通常在目标线程上转换ID。Andrew P.S.如果您喜欢这个答案,请记住选择它作为“正确”答案。