Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 批处理核心数据中的错误子关系_Objective C_Ios_Core Data - Fatal编程技术网

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更完整的答案。