gpt4 book ai didi

sorting - Core Data 后台排序

转载 作者:行者123 更新时间:2023-12-04 22:02:39 26 4
gpt4 key购买 nike

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

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

代表1 : 在 Department 中定义一个获取的属性(排序由 Core Data 完成);

代表2:维护实例变量 sortedEmployees (NSArrayEmployee 个对象)在部门(排序由我的代码完成)。

现在我真正的问题是,当应用程序启动时,我有大量 DepartmentsEmployees从持久存储中获取。我想在后台执行排序,以免阻塞 UI。

我尝试了几种方法,但最终都徒劳无功:

方法1 (使用 Rep1 ):在后台线程中(使用 NSOperationQueue ),获取所有 Departments ,然后执行每个获取的属性。然后回到主线程,找到对应的Department主线程的托管对象上下文( MOC )中的对象(由 NSManagedObjectID )并使用 fetched 属性。
Method1的问题:即使后台Department的fetch完成后,主线程Department对象中的fetched属性也没有填充,这意味着它在主线程Department中重新获取!这违背了后台获取的全部目的。假设所有 MOC 中都存在已获取的属性,我是否错了?

方法二 (使用 Rep2 ):在后台线程中(使用 NSOperationQueue ),获取所有 Departments ,然后计算每个人的sortedEmployees大批。然后回到主线程,在主线程的中找到对应的Department对象商务部 (通过 NSManagedObjectID )并将上述数组设置为此对象。
方法 2 的问题:sortedEmployees 中的对象数组是 Employee属于后台线程的 的对象商务部 .当主线程稍后尝试访问它们时,会发生类似于 "NSManagedObject with ID ... has been invalidated." 的崩溃。这是因为每个线程都必须有自己的 MOC(及其关联的托管对象)。

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

最佳答案

庇护,

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

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

for (mo in array) {

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

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

安德鲁

关于sorting - Core Data 后台排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8052501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com