В моем приложении у меня есть «основной» контекст NSPrivateQueueConcurrencyType
, который служит родителем для контекста NSMainQueueConcurrencyType
, на который полагается и который передает контроллер представления. Я хотел сделать это, чтобы воспользоваться преимуществами асинхронного сохранения (. Это приложение использует iCloud с Core Data, и сохранения выполняют большую работу по экспорту журналов вездесущности ). Установка аналогична подходу Zarra, упомянутому в нижней части этой статьи
. Сохранения в приложении обычно выглядят как:
[context save:nil];
[context.parentContext performBlock:^{
[context.parentContext save:nil];
}];
Кажется, это хорошо работает для небольших правок/обновлений, но меня смущает то, что я вижу, когда удаляю много объектов (, например, удаляю проект, с которым связаны сотни объектов задач ).
В этой ситуации сохранение является асинхронным, но похоже, что основной поток попадает в ситуацию ожидания семафора (, как видно, когда я приостанавливаю отладчик )и эффективно блокируется (Я не могу прокручивать пользовательский интерфейс )до тех пор, пока фоновый частный контекст не завершит сохранение.
На самом деле, я только что заметил, что смахивание от -до -удаляет удаление одного объекта с заметной задержкой, несмотря на этот шаблон асинхронного сохранения, поэтому кажется, что все удаления в приложении медленные.
Если, в качестве альтернативы, я выделяю новый NSPrivateQueueConcurrencyType
контекст, устанавливаю его постоянный координатор хранилища на основной PSC в AppDelegate и выполняю удаление и сохранение, он все равно выполняет много работы, но пользовательский интерфейс никогда не блокируется (, но тогда мне приходится беспокоиться о согласовании контекстов, повторной выборке в основном контексте ).
Любые идеи, что я мог сделать неправильно, или вы тоже видели такое поведение?