0

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

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

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

ответ

1

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

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

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

+0

В методе AppDelegate didFinishLaunchingWithOptions: [[NSNotificationCenter defaultCenter] addObserver: автономный селектор: @selector (changesSaved :) Название: NSManagedObjectContextDidSaveNotification объекта: ноль];
Это вызывает:
- (Недействительными) changesSaved: (NSNotification *) примечание { [само performSelectorOnMainThread: @selector (changesSavedOnMainThread :) withObject: обратите внимание waitUntilDone: YES]; }
Наконец,
- (Недействительными) changesSavedOnMainThread: (NSNotification *) примечание { \t если ([примечание объект]!= __managedObjectContext) [__managedObjectContext mergeChangesFromContextDidSaveNotification: note]; } – flizit

+0

Извините, этот комментарий выглядит ужасно. В любом случае, я обратился к этой обработке, чтобы теоретически сохранить основной поток как можно более свободным. Я определенно мог бы настроить, как влияет производительность на обработку в основном потоке, а также на фоне. – flizit

2

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

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

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

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

+0

Спасибо за ваш ответ. Боюсь, мне пришлось бы добавить много кода для управления этим типом реализации, но это звучит неплохо. – flizit

Смежные вопросы