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.如果您喜欢这个答案,请记住选择它作为“正确”答案。