Использование Core Data с использованием многопоточности и уведомлений - PullRequest
0 голосов
/ 28 ноября 2010

Вот еще один вопрос о 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, поэтому я мог бы получать уведомления из контекстов, которые меня не касаются, если я не укажу источник.Тем не менее, документация, на которую я ссылался ранее, ничего не говорит об этом.Любые комментарии по выбору дизайна приветствуются.

1 Ответ

1 голос
/ 29 ноября 2010

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

Все это потокобезопасно, поскольку данные не будут удалены из постоянного хранилища, пока один или несколько контекстов все еще используют его. Таким образом, если контекст A имеет объект с данными, а контекст B удаляет другой объект, представляющий те же данные, объект в контексте A остается живым, пока контекст A не вызовет слияние.

По сути, каждый контекст работает в своем маленьком мире, пока вы не вызовете слияние. Условия состязания, которые обычно наносят ущерб операциям с данными на основе потоков, не возникают с Базовыми данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...