Core data CoreData:获取背景和ObjectId

Core data CoreData:获取背景和ObjectId,core-data,ios7,Core Data,Ios7,对于两个核心数据实体A和B,其中A与B有一对多关系,我尝试在后台上下文中执行提取,其父级是主上下文[与UI关联]。由于我需要预取方式的结果,即核心数据也必须填充关系,如下所示[使用MagicalRecord]: NSManagedObjectContext* bgContext = [NSManagedObjectContext context]; [bgContext performBlock:^{ NSpredicate * searchPredicate = <some s

对于两个核心数据实体A和B,其中A与B有一对多关系,我尝试在后台上下文中执行提取,其父级是主上下文[与UI关联]。由于我需要预取方式的结果,即核心数据也必须填充关系,如下所示[使用MagicalRecord]:

NSManagedObjectContext* bgContext = [NSManagedObjectContext context];

[bgContext performBlock:^{
    NSpredicate * searchPredicate = <some search criteria in entity A>
    if(!searchPredicate){
        dispatch_async(dispatch_get_main_queue(), ^{
    //completionBlock is a callback block to be executed on main thread.        completionBlock(nil);
            return;
        });
    }
    //Using below request to get relationship data in pre-fetch format.
    NSFetchRequest* aRequest = [A requestAllSortedBy:@"<aColumn>" ascending:YES withPredicate:searchPredicate inContext:bgContext];

    [aRequest setReturnsObjectsAsFaults:YES];
    [aRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"photos"]];//photos is a relationship between A and B
    [aRequest setIncludesPropertyValues:YES];
    [aRequest setIncludesSubentities:YES];




    NSArray *as = [A executeFetchRequest:aRequest inContext:bgContext];
    if (as == nil) {
        dispatch_async(dispatch_get_main_queue(), ^{
            completionBlock(nil);
            return;
        });
    }
    NSArray *objectIDs =[as valueForKey:@"objectID"];

    NSManagedObjectContext *mainContext = [NSManagedObjectContext defaultContext];
    [mainContext performBlock:^{

        //temporary bad solution
        NSMutableArray *entities = [[NSMutableArray alloc] init];
        for (A *a in as) {
            [entities addObject:[a inContext:mainContext]];
        }
        completionBlock([NSArray arrayWithArray:entities]);
    }];


}];
NSManagedObjectContext*bgContext=[NSManagedObjectContext];
[bgContext performBlock:^{
NSpredicate*搜索谓词=
if(!searchPredicate){
dispatch\u async(dispatch\u get\u main\u queue()^{
//completionBlock是要在主线程上执行的回调块;
返回;
});
}
//使用以下请求以预取格式获取关系数据。
NSFetchRequest*aRequest=[A requestAllSortedBy:@”“升序:yeswithpredicate:searchPredicate inContext:bgContext];
[aRequest setReturnsObjectsAsFaults:是];
[aRequest SetRelationshipKeyPaths预处理:[NSArray arrayWithObject:@“photos”]];//照片是a和B之间的关系
[请求集包括属性值:是];
[请求集包括子实体:是];
NSArray*as=[A executeFetchRequest:aRequest inContext:bgContext];
如果(as==nil){
dispatch\u async(dispatch\u get\u main\u queue()^{
完井区块(无);
返回;
});
}
NSArray*objectID=[作为valueForKey:@“objectID]”;
NSManagedObjectContext*mainContext=[NSManagedObjectContext defaultContext];
[主上下文执行锁:^{
//暂时的坏办法
NSMutableArray*实体=[[NSMutableArray alloc]init];
for(as中的A*A){
[entities addObject:[a inContext:mainContext]];
}
completionBlock([NSArray arrayWithArray:entities]);
}];
}];
虽然结果正如预期的那样,但我想知道,在注释“//临时糟糕的解决方案”下面的上述方法是否有效。
即使我将objectid传递给主上下文,那么在这种情况下,关系将如何预取?

最好的选择是获取所有托管对象id并将它们传递给主线程。然后,根据主线程上的要求,从对象ID批量加载托管对象,并缓存托管对象实例(刷新它们以将其转换为故障,但如果内存不足,则保留托管对象)。

在所有结果中,有多少需要一次加载到内存中?通常不超过20个,所以总是将它们全部加载是没有效率的。如果我仍然在上面的代码中设置了批处理大小,那么我还需要循环整个结果,以便转换nsmanagedobject与主上下文的关联,不是吗?