Objective c 批处理核心数据中的错误子关系
我有一个非常简单的小模式,如下所示:Objective c 批处理核心数据中的错误子关系,objective-c,ios,core-data,Objective C,Ios,Core Data,我有一个非常简单的小模式,如下所示: NSArray *trails = <query all trails> for (Trail *trail in trails) { for (Segment *segment in trail.segments) { for (Coordinate *coordinate in segment.coordinates) { //do something with coords
NSArray *trails = <query all trails>
for (Trail *trail in trails) {
for (Segment *segment in trail.segments) {
for (Coordinate *coordinate in segment.coordinates) {
//do something with coords
}
}
}
轨迹-->段-->坐标
所有适当的关系都已经到位,使这项工作得以实施,他们当然让我做了如下事情:
NSArray *trails = <query all trails>
for (Trail *trail in trails) {
for (Segment *segment in trail.segments) {
for (Coordinate *coordinate in segment.coordinates) {
//do something with coords
}
}
}
NSArray*trails=
用于(轨迹*轨迹中的轨迹){
用于(trail.segments中的段*段){
用于(坐标*段中的坐标。坐标){
//用coords做点什么
}
}
}
来自Django的背景,我对此感到高兴,并假设对sqlite3运行的查询尽可能少。错了!这些循环中的每个对象都有一个查询
我现在已经阅读了关于故障的核心数据文档,我了解了发生了什么,尽管我真的很想知道处理这种情况的最佳实践是什么。我需要内存中的每一个对象(coords模型有大约100000个对象),因为它们在同一时刻都用于在地图上绘制轨迹
我应该如何处理这种超延迟加载?您可以使用
NSFetchRequest
的setRelationshipKeyPaths预处理:
方法进行此操作。从文件中:
预取允许核心数据在单个数据库中获取相关对象
获取(每个实体),而不是引发对
当故障跳闸时,存储每个单独的记录
因此,在您的初始获取请求中,您可以添加轨迹
[request setRelationshipKeyPathsForPrefetching:
[NSArray arrayWithObjects:@"segments", @"segments.coordinates", nil]]
(我从来没有尝试过两层深度,只有一层。)我研究过这种方法,但我认为它只适用于1:1的预取关系(比如子预取它的父级,或者在本例中,段预取它的轨迹)。反正我也试过了,运气不好。谢谢你!我的回答有一个错误:一定是。。。带对象的数组:@“段”,“段.坐标”,无!我刚试过,它似乎很管用。如果将“-com.apple.CoreData.SQLDebug 3”设置为启动参数,则可以看到在初始获取请求中检索到所有数据。这是通过3个sqlite查询完成的,与对象的数量无关。第一个sqlite查询用于所有轨迹对象。第二个查询是针对属于其中一条轨迹的所有线段对象,第三个查询是针对属于其中一条线段的所有坐标对象。我在最初发布时注意到该错误,并(认为)在看到以前的结果时已更正该错误,但现在我再次尝试,它似乎正在工作。谢谢相关:我认为预取一对多关系中的子对象是可能的,加载父对象后批处理错误处理这种关系也是可能的。如果有机会的话,我可能会对这两种方法进行测试,然后发布一个比Martin R更完整的答案。