Я работаю над приложением для iPhone, которое использует Базовые Данные. Приложение звонит веб-сервису, анализирует получающийся XML-файл, и затем создает или изменяет Базовые Объекты данных в моем приложении. Я уже обрабатываю вызов веб-сервиса и анализирующий асинхронно, но я возвращал проанализированные данные основному потоку для управления Базовыми Объектами данных. Я хотел бы работать, этот процесс в фоновом режиме распараллеливают также. (1-2 вторых паузы не делают для большого пользовательского опыта),
Очевидный подход должен был бы создать контекст управляемого объекта специально для фонового потока, но тогда я считал эту строку в Базовом Руководстве по программированию Данных Apple:
Персистентный координатор хранилища предоставляет его контекстам управляемого объекта фасад одного виртуального хранилища. Для абсолютно параллельных операций Вам нужен другой координатор для каждого потока.
Таким образом, вот выгода: Вы не можете иметь два NSPersistentStoreCoordinator
s обеспечение доступа к тому же хранилищу. Но, Базовый Справочник Marcus Zarra утверждает это NSPersistentStoreCoordinator
ориентировано на многопотоковое исполнение и сериализирует запросы ввода-вывода (стр 157).
Кто-то может разрешить это для меня? Действительно ли возможно иметь второй контекст управляемого объекта, работающий на отдельном потоке, совместно использующем то же NSPersistentStoreCoordinator
с основным потоком? Или, более кратко, NSPersistentStoreCoordinator
ориентированный на многопотоковое исполнение?
Позже Zarra указывает, что контекст блокирует хранилище, поэтому можно использовать один и тот же NSPersistentStoreCoordinator через потоки .
Хотя NSPersistentStoreCoordinator не является резьбонадежный NSManagedObjectContext умеет запирайте его надлежащим образом при использовании. Поэтому мы можем прикрепить столько NSManagedObjectContext объекты на a единственный NSPersistentStoreCoordinator в качестве Мы хотим, не опасаясь столкновения.
Возможно ли выполнение второго контекста управляемого объекта на отдельном потоке, разделяющем NSPersistentStoreCoordinator с основным потоком?
Да! Я рекомендую внимательно прочитать соответствующий раздел книги Zarra, прежде чем приступать к многопоточному доступу к CoreData.
Или, если говорить коротко, является ли NSPersistentStoreCoordinator потоковым безопасным?
Ну, слово `thread-safe` имеет оттенки смысла в Apple doc, так что будьте очень осторожны! Смотрите эту статью в блоге для получения хорошего объяснения.