添加到关系后未在核心数据中找到对象

Not found an object in coredata after added to a relationship

我在添加关系后获取对象时遇到问题。我第一次获取类别时,总是找到,然后当我添加到关系时,找不到以下类别。

关系是Many-To-Many

示例:

编辑:

已解决,我想我的问题是我忘记在每次迭代结束时保存主上下文。

        NSManagedObjectContext *backgroundMOC = [self.model backgroundMOC:self.model.context];

        [backgroundMOC performBlockAndWait:^{

            for (NSDictionary *dic in responseObject[@"response"]) {

                GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:backgroundMOC];

                GPCategory *category;
                if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:backgroundMOC])) {
                    NSLog(@"Found with mainAttribute %@", dic[@"mainAttribute"]);
                    [deal addDealCategoryObject:category];
                }

                if([backgroundMOC hasChanges]) {
                    NSError * error;
                    [backgroundMOC save:&error];

                    [self.model.context performBlockAndWait:^{
                        if([self.model.context hasChanges]) {
                            NSError * error;
                            [self.model.context save:&error];
                        }
                    }];
                }
            }
        }];

您可能缺少保存MOC链。为清楚起见,我将关键字 private 替换为变量名称 backgroundMOC.

关于上述问题,我只能假设 NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 行在技术上类似于:

- (NSManagedObjectContext *)backgroundMOC:(NSManagedObjectContext *)mainMOC
{
    NSManagedObjectContext * threadManagedObjectContext = [[NSManagedObjectContext alloc]
                             initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [threadManagedObjectContext setParentContext:mainMOC];
    [threadManagedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
    return threadManagedObjectContext;
}

传递 self.model.context 作为 mainMOC,带有 self.model.contextsetMergePolicy
同样,我必须假设 self.model saveWithErrorBlock 在技术上等同于:

[mainMOC performBlockAndWait:^{
    if([mainMOC hasChanges]) {
        NSError * error;
        [mainMOC save:&error];
        // handle error
    }
}];

如果是这样,backgroundMOC(您的 private 参考)也应该这样说:

[backgroundMOC performBlockAndWait:^{
    if([backgroundMOC hasChanges]) {
        NSError * error;
        [backgroundMOC save:&error];
        // handle error
    }
}];

换句话说,您要确保 backgroundMOCmainMOC 保存操作是从各自的线程执行的,performBlockAndWait.