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

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

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

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

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

2 Solutions collect form web for “Основные данные – совместное использование NSManagedObjects из нескольких потоков”

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

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

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

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

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

  • Программное создание ограничения «расстояние до ближайшего соседа»
  • как я должен защищать код для возможного повреждения файлов данных или загрузки?
  • Обнаружение Если push-уведомления были получены, когда приложение не запущено, и пользователь не открыл приложение через них
  • Визуализация иерархии представлений в iOS
  • Код iOS 8 работает на iPhone 5, но не iPhone 5
  • Стандартный режим воспроизведения MPMoviePlayer для воспроизведения / паузы
  • Мой метод всегда возвращает FALSE
  • Отключить горизонтальную прокрутку в UITextView Programmatically
  • Универсальные 2D-игры и абсолютное позиционирование узла
  • Приложение iOS отклонено по причине 3.8 (неприемлемый рейтинг)
  • Ориентация устройства не получается.
  • Как добавить ссылку на раскадровку в другой раскадровки
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.