我正在处理的情况是,如果存在将被删除的对象会通过级联删除关系导致指数级删除的情况。通过这种方式,删除这些对象中的20个可能会导致〜3,000个对象最终被删除。如果使用主要上下文执行,这会导致非常缓慢的保存。在核心数据中处理大量删除/插入
为了解决这个问题,我创建一个使用相同的持久性存储为主要背景下,“工人”背景下,更改那里,然后保存工人背景和合并与主背景下这些变化:
NSManagedObjectContext *workerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerContext.persistentStoreCoordinator = mainContext.persistentStoreCoordinator;
[notificationCenter addObserver:self selector:@selector(workerContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:workerContext];
// Here I do a 'superficial' deletion on the main context, so the UI updates,
// but do the actual deletion on the worker context. Then I save the worker context:
[workerContext save:nil];
// Which fires spawnedWorkerContextDidSave:, where I merge changes to the main context:
[mainContext performBlockAndWait:^{
[mainContext mergeChangesFromContextDidSaveNotification:notification];
}];
我的问题是:处理这些大批量删除批次的最常用方法是什么?我的方法有什么缺陷吗?另外,合并会在主线程上造成一些小的延迟,但是当我执行删除操作并保存在主线程中时,它并没有接近它的位置。
尝试在主线程中不使用GCD。 –
@SunilSingh这就是我在这里所做的。工作者上下文使用它自己的线程。 – mattsven