Ios 在核心数据中执行大规模删除时尝试实现主子托管对象上下文

Ios 在核心数据中执行大规模删除时尝试实现主子托管对象上下文,ios,core-data,nsmanagedobject,nsmanagedobjectcontext,Ios,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我正在从事一个项目,在该项目中,我正在对从核心数据中检索到的许多NSManagedObjects(MO)进行大规模删除。当我迭代此MO集合时,我还通过在初始MO集合的迭代期间调用fetch方法来检索其他MO 如果在此迭代过程中,从fetch请求中找到对象,则删除MO。我意识到这是一个糟糕的架构设计,因为这些MO实际上应该彼此具有反向关系,因此通过级联删除规则,所有这些对象都很容易被删除。不幸的是,情况并非如此,要回去修复这些问题太难了,这就是我来这里的原因 此外,我意识到我正在描述的这个场景应该

我正在从事一个项目,在该项目中,我正在对从核心数据中检索到的许多NSManagedObjects(MO)进行大规模删除。当我迭代此MO集合时,我还通过在初始MO集合的迭代期间调用fetch方法来检索其他MO

如果在此迭代过程中,从fetch请求中找到对象,则删除MO。我意识到这是一个糟糕的架构设计,因为这些MO实际上应该彼此具有反向关系,因此通过级联删除规则,所有这些对象都很容易被删除。不幸的是,情况并非如此,要回去修复这些问题太难了,这就是我来这里的原因

此外,我意识到我正在描述的这个场景应该使用父子NSManagedObjectContext来做正确的事情,当然,也是为了避免发生崩溃。鉴于我正在使用的体系结构,我不确定如何实现这一点。下面是我正在使用的代码示例:

- (void)massDelete {

...
       NSArray *objectsToPurge = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

       if (objectsToPurge) {

            [objectsToPurge enumerateObjectsUsingBlock:^(MyMO *mo, NSUInteger idx, BOOL *stop) {

                OtherMO *otherMO = [self fetchOtherMO:mo];

                if (otherMO) {
                    [self.managedObjectContext deleteObject:otherMO];
                }

                [self.managedObjectContext deleteObject:mo];

            }];
        }

        [self.managedObjectContext save:&purgeError];
}


    - (OtherMO *)fetchOtherMO:(MyMO *)mo {

        NSManagedObjectContext *context = [[MySingleton sharedInstance] managedObjectContext];
        NSError *error;

        // Create fetch request
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"OtherMO" inManagedObjectContext:context];
        [fetchRequest setEntity:entity];

        // Create predicate
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"myMO == %@", mo];
        [fetchRequest setPredicate:pred];

        NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
        if ([items count]>0) {
            return [items firstObject];
        } else {
            return nil;
        }
    }

正如我所说,我意识到我在这里使用两个单独的NSManagedObjectContext,我需要实现一个父子构造,但我不确定如何实现。考虑到我对核心数据体系结构无能为力,并且考虑到这是我正在处理的场景,我的问题的最佳解决方案是什么?

我认为它不需要两个主运行中心,您可以通过一个主运行中心来解决它。只需将其作为参数传递给
fetchothermobymo:(MyMo*)mooncontext:(NSManagedObjectContext*)上下文。

而且您忘记使用
performBlock:
Check,它应该可以正常工作而不会崩溃:

- (void)massDelete {

...
__weak typeof(self) weakSelf = self;
self.managedObjectContext performBlock:^{
       NSArray *objectsToPurge = [weakself.managedObjectContext executeFetchRequest:fetchRequest error:&error];

       if (objectsToPurge) {

            [objectsToPurge enumerateObjectsUsingBlock:^(MyMO *mo, NSUInteger idx, BOOL *stop) {

                OtherMO *otherMO = [weakself fetchOtherMO:mo onContext:weakself.managedObjectContext];

                if (otherMO) {
                    [weakself.managedObjectContext deleteObject:otherMO];
                }

                [weakself.managedObjectContext deleteObject:mo];

            }];
        }

        [weakself.managedObjectContext save:&purgeError];
});
}

- (OtherMO *)fetchOtherMO:(MyMO *)mo onContext:(NSManagedObjectContext *)context{
        NSError *error;

        // Create fetch request
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"OtherMO" inManagedObjectContext:context];
        [fetchRequest setEntity:entity];

        // Create predicate
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"myMO == %@", mo];
        [fetchRequest setPredicate:pred];

        NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
        if ([items count]>0) {
            return [items firstObject];
        } else {
            return nil;
        }
    }

非常感谢您的解决方案!它工作得很好!