Безопасен ли NSPersistentStoreCoordinator?

Я работаю над iPhone-приложением, которое использует Core Data. Приложение делает вызов веб-службы, анализирует полученный XML файл, а затем создает или изменяет объекты Core Data в моем приложении. Я уже обрабатываю вызов веб-службы и анализирую асинхронно, но я передавал анализируемые данные обратно в основной поток, чтобы манипулировать объектами Core Data. Я также хотел бы запустить этот процесс в фоновом потоке. (1-2-секундная пауза не создает большой опыт пользователя)

Очевидным подходом было бы создание контекста управляемого объекта специально для фонового потока, но затем я прочитал эту строку в Руководство по программированию ядра Apple Core:

Постоянный координатор хранилища предоставляет своим управляемым объектам контексты фасад одного виртуального хранилища. Для полностью параллельных операций вам нужен другой координатор для каждого потока.

Итак, вот улов: у вас не может быть двух NSPersistentStoreCoordinator, обеспечивающих доступ к одному и тому же хранилищу. Но в книге Core Data Marcus Zarra утверждается, что NSPersistentStoreCoordinator является потокобезопасным и будет сериализовать запросы ввода-вывода (стр. 157).

Может кто-нибудь прояснить это для меня? Возможно ли иметь второй контекст управляемого объекта, работающий на отдельном потоке, который имеет один и тот же NSPersistentStoreCoordinator с основным потоком? Или, более лаконично, NSPersistentStoreCoordinator поточно-безопасный?

Ответ 1

Далее Zarra указывает, что контекст блокирует хранилище, поэтому нормально использовать тот же NSPersistentStoreCoordinator по потокам.

Хотя NSPsistentStoreCoordinator не нитевидный, либо NSManagedObjectContext знает, как правильно закрепите его при использовании. Поэтому мы можем присоединить столько Объекты NSManagedObjectContext для одиночный NSPsistentStoreCoordinator as мы хотим, не опасаясь столкновения.

Ответ 2

Возможно ли, чтобы второй управляемый объект контекста работал в отдельном потоке, совместно использующем тот же NSPsistentStoreCoordinator с основным потоком?

Да! Я рекомендую вам внимательно прочитать соответствующий раздел книги Zarra, прежде чем вступать в многопоточный доступ к CoreData.

Или, более лаконично, NSPersistentStoreCoordinator потокобезопасен?

Ну, слово "потокобезопасное" имеет оттенки смысла в документе Apple, поэтому будьте очень осторожны! См. Эту статью статью в блоге для приятного объяснения.