Основные данные с несколькими фоновыми потоками - PullRequest
0 голосов
/ 02 марта 2012

У меня есть приложение для iphone / ipad, использующее Core Data. Данные предоставляются через различные вызовы веб-службы. Я использую механизм опроса, чтобы определить, когда каждый из сервисных вызовов должен выполняться независимо друг от друга, чтобы поддерживать актуальность информации. Таким образом, вполне может быть несколько фоновых потоков, обрабатывающих данные из этих вызовов с использованием нескольких MOC. Для вставок и обновлений этот подход работает отлично. При попытке реализовать функцию удаления моя программа вылетает. Кажется, это вызвано тем, что контекст в одном потоке удаляет управляемый объект, с которым также работает другой поток, поскольку удаленный объект был поврежден.

Я искал решения в Интернете, но не нашел ничего конкретного. Должны ли быть удалены удаления в контексте основного потока? Как насчет поддержки одного потока и сопровождающих MOC в Singleton для выполнения всей обработки?

Любая помощь / руководство будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Мне показалось полезным в ситуациях одновременного доступа к набору данных, совместно используемых частями одного и того же приложения, использовать пометки объектов как устаревших перед их фактическим удалением.

Это облегчает отловзапросы на устаревшие данные и соответствующие ответы.

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

В зависимости от типа и объема данных и частоты внесения изменений, этоподход, возможно, нуждается в уточнении.

1 голос
/ 02 марта 2012

Я искал решения в Интернете, но не нашел ничего конкретного.

Вы уже пробовали все, что Apple предлагает в Руководстве по программированию основных данных ?Не видя вашего кода, мне кажется, что вам не хватает части NSManagedObjectContextDidSaveNotification .Каждый поток должен зарегистрироваться для сохранения MOC в других потоках.Это означает, что все потоки должны иметь цикл выполнения.

В целом все выглядит немного грязно.Я думаю, что я бы изменил архитектуру, чтобы сделать все изменения основных данных в главном потоке (а не просто удалить).

...