Я имею дело со сценарием, где есть объекты, которые, если они будут удалены, приведут к экспоненциальному количеству удалений через отношения каскада-удаления. Таким образом, удаление 20 из этих объектов может привести к уничтожению ~ 3000 объектов. Это может привести к очень медленным экономиям, если они выполняются с основным контекстом.Обработка тяжелых удалений/вставок в данных ядра
Для борьбы с этим, я создаю «работник» контекст, который использует то же постоянное хранилище в качестве основного контекста, внесение изменений там, затем сохранить контекст уборщицы и слияние этих изменений с основным контекстом:
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