Вот еще один вопрос о Core Data и многопоточности:
Я пишу на iPhone приложение, которое извлекает данные XML из Интернета, анализирует их в фоновом потоке (используя NSXMLparser) и сохраняет данныев Core Data, используя свой собственный NSManagedObjectContext.У меня есть класс - давайте назовем его DataRetriever - который делает это для меня.
Существуют разные UIViewControllers, которые затем извлекают данные для отображения в соответствующих UITableView, конечно, это происходит в главном потоке с использованием NSFetchedResultsControllers иодин контекст управляемого объекта, который используется для чтения.
Я прочитал ответ на этот вопрос , который говорит мне, что мне нужно зарегистрироваться для NSManagedObjectDidSaveNotifications в фоновом потоке (это будетдолжно быть сделано классом DataRetriever (я полагаю), а затем вызвать метод mergeChangesFromContextDidSaveNotification в контексте чтения из этого класса в основном потоке.Это, я думаю, совершенно небезопасно.Я, возможно, истолковал это неправильно, хотя.
Я также прочитал эту часть документации Apple по этому вопросу ( Отслеживание изменений в других потоках с использованием уведомлений) и он говорит мне просто зарегистрироваться для NSManagedObjectDidSaveNotifications из контекста чтения в контроллера представления в основного потока, а затем он должен будет вызвать mergeChangesFromContextDidSaveNotificationчтобы обновить его контекст чтения.
Я пошел с рекомендациями Apple: теперь мои контроллеры представления регистрируются в NSManagedObjectDidSaveNotifications в главном потоке, используя контекст управляемого объекта чтения в качестве источника уведомлений.Выполнение этого в контексте написания, вероятно, не является потокобезопасным, и документация Apple не очень специфична в этом отношении.
Результат: нет сбоев, но я также не получаю никаких уведомлений.
Примечание: я прочитал в документации Apple, что уведомления не распространяются автоматически на другие потоки, и я могу даже прослушивать уведомления из неправильного контекста, но почему Apple тогда советует мне делать это так?
Любая помощь приветствуется.
- РЕДАКТИРОВАТЬ -
Просто для ясности, я регистрируюсь для уведомлений, приходящих от конкретного NSManagedObjectContext, AppleВ документации конкретно говорится ( здесь ), что некоторые системные платформы могут использовать экземпляр самих Core Data, поэтому я мог бы получать уведомления из контекстов, которые меня не касаются, если я не укажу источник.Тем не менее, документация, на которую я ссылался ранее, ничего не говорит об этом.Любые комментарии по выбору дизайна приветствуются.