在Core Data中进行批量删除时试图实现主 – 子托pipe对象上下文
我正在一个项目中,我正在做一个从Core Data中检索的NSManagedObjects(MO)的批量删除。 当我迭代MO的这个集合时,我也通过在初始MO集合迭代期间调用一个获取方法来检索OTHER MO。
如果在这个迭代过程中,从获取请求中find一个对象,则MO被删除。 我意识到这是一个糟糕的架构devise,因为这些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; } }
就像我说的,我意识到,我在这里使用两个单独的NSManagedObjectContexts,我需要实现一个Parent-Child构造,但我不确定如何做到这一点。 鉴于我不能做任何关于核心数据架构的事情,鉴于这是我正在使用的场景,对于我的问题,最好的解决scheme是什么?
在此先感谢所有回复的人。
我认为这不需要两个MOC,你可以通过一个解决。 只需将它作为parameter passing给fetchOtherMOByMyMo:(MyMo *)mo onContext:(NSManagedObjectContext *)context.
而你忘记使用performBlock:
检查,它应该没有崩溃的工作:
- (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; } }