Основные данные – совместное использование NSManagedObjects из нескольких потоков

Я перенес все последствия использования одного MOC в нескольких потоках – мое приложение падает в случайных точках, потому что MOC создается в основном потоке, и я также использую его для заполнения БД в другом потоке. Хотя код синхронизирован (@synchronize), используя глобальный синглтон, приложение отключается. Я прочитал, что использование отдельного MOC для каждого потока сделает все хорошо, но я также прочитал, что это также плохой подход для совместного использования NSManagedObjects по потокам.

Моим вариантом использования является следующее: 1) Я загружаю и разбираю XML с сервера, и во время разбора я вставляю каждый новый NSManagedObject в базу данных. Все это происходит в отдельном потоке. 2) В основном потоке пользователь взаимодействует с пользовательским интерфейсом, который считывает данные из базы данных.

В обоих потоках я использую NSManagedObjects. Как бы вы посоветовали мне это исправить? Я несколько раз провалился.

Чаще всего приложение зависало с ошибкой, предполагая, что я изменяю коллекцию при перечислении ее, которая не является истиной, поскольку код синхронизирован, и пока я повторяю его, никакое изменение не происходит, и наоборот – пока я его изменяю, я не перебираю и я сэкономьте, как только я закончу.

Используйте один NSManagedObjectContext каждого потока. Если вы связываетесь между потоками, передайте NSManagedObjectID , который является потокобезопасным, и снова извлеките объект из контекста потока. В моих приложениях я иногда даже использую один контекст для каждого контроллера.

Чтобы управлять различными контекстами, зарегистрируйте Observer для NSManagedObjectContextDidChangeNotification . В рамках этой обработки уведомлений вы передаете уведомление в каждый из ваших контекстов с помощью метода mergeChangesFromContextDidSaveNotification: . Этот метод поддерживает поток и позволяет контексту обновить его состояние.

После этого вы должны обновить свои взгляды. Если у вас есть приложение на основе табличного представления, посмотрите NSFetchedResultsController . Это поможет вам автоматически обновить таблицу с помощью соответствующих анимаций. Если вы не используете представления таблиц, вам необходимо самостоятельно выполнить обновление пользовательского интерфейса.

Если вы поддерживаете только iOS 5 и выше, вам больше не нужно иметь дело с NSManagedObjectID и слиянием контекстов. Вместо этого вы можете использовать новые типы параллелизма NSManagedObjectContext . Затем выполните свои операции в пределах managedObjectContext:performBlock и они будут объединены автоматически.

См. Ответ от svena здесь для получения дополнительной информации: Основные данные и параллелизм с использованием NSOperationQueues

  • NSPredicate не возвращает результаты с запросом на выборку, работает с фильтрацией массивов
  • NSPredicate не выполнен
  • URLForUbiquityContainerIdentifier всегда возвращает ноль
  • Инициализация основных данных с данными по умолчанию
  • RestKit CoreData зависает во время модульного теста
  • Ошибка EXC_BAD_ACCESS для NSManagedObject, реализующая протокол в Swift
  • Как предварительно загрузить данные в базу данных для iOS?
  • Контекстный шаблон? Почему Core Data нуждается в этом?
  • CoreData Swift: как сохранить и загрузить данные?
  • iCloud & Core Data - «Путь находится за пределами любого контейнера CloudDocs, никогда не синхронизируется»
  • NSManagedObjectContext в несогласованном состоянии после mergeChangesFromContextDidSaveNotification в фоновом контексте
  • Interesting Posts

    Swift: добавить пользовательский вид внутри CALayer

    как использовать writeToFile для сохранения изображения в каталоге документов?

    Собирать объект даты из целых чисел?

    Автоматическое изменение размера UIButton на основе заголовка – AutoLayout ON

    Получите подробное использование процессора iOS с различными состояниями

    Использование @import от clang?

    Простые примеры внедрения push-уведомлений с использованием последней версии Phonegap для iOS?

    Как решить эту проблему с CollectionView?

    Новая ошибка подключения к iTunes «Вы должны выбрать сборку»,

    Установите отображение / скрытие для разрешения главного представления в UISplitViewController только для одного контроллера вида в ландшафтном режиме

    Ограничения AutoLayout для авторезистентного представления, созданного в LoadView ViewController

    Как создать промо-код для покупок iOS в приложении

    Обновление вида расширения Today

    Как оживить NSLayoutConstraint в CAAnimationGroup

    VM: CG растровый Память данных продолжает расти

    Давайте будем гением компьютера.