Медленное удаление и сохранение во вложенном NSManagedObjectContext

В моем приложении у меня есть «основной» контекст NSPrivateQueueConcurrencyType, который служит родителем для контекста NSMainQueueConcurrencyType, на который полагается и который передает контроллер представления. Я хотел сделать это, чтобы воспользоваться преимуществами асинхронного сохранения (. Это приложение использует iCloud с Core Data, и сохранения выполняют большую работу по экспорту журналов вездесущности ). Установка аналогична подходу Zarra, упомянутому в нижней части этой статьи

. Сохранения в приложении обычно выглядят как:

[context save:nil];
[context.parentContext performBlock:^{
     [context.parentContext save:nil];
}];

Кажется, это хорошо работает для небольших правок/обновлений, но меня смущает то, что я вижу, когда удаляю много объектов (, например, удаляю проект, с которым связаны сотни объектов задач ).

В этой ситуации сохранение является асинхронным, но похоже, что основной поток попадает в ситуацию ожидания семафора (, как видно, когда я приостанавливаю отладчик )и эффективно блокируется (Я не могу прокручивать пользовательский интерфейс )до тех пор, пока фоновый частный контекст не завершит сохранение.

На самом деле, я только что заметил, что смахивание от -до -удаляет удаление одного объекта с заметной задержкой, несмотря на этот шаблон асинхронного сохранения, поэтому кажется, что все удаления в приложении медленные.

Если, в качестве альтернативы, я выделяю новый NSPrivateQueueConcurrencyTypeконтекст, устанавливаю его постоянный координатор хранилища на основной PSC в AppDelegate и выполняю удаление и сохранение, он все равно выполняет много работы, но пользовательский интерфейс никогда не блокируется (, но тогда мне приходится беспокоиться о согласовании контекстов, повторной выборке в основном контексте ).

Любые идеи, что я мог сделать неправильно, или вы тоже видели такое поведение?

5
задан Daniel 6 August 2012 в 04:38
поделиться