Основные данные – совместное использование 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

  • iOS: if-else внутри stringwithformat
  • Индивидуальный доступ к светодиодной подсветке камеры iPhone 5s
  • изменить положение деталитекстовой метки в ячейке?
  • Простая грамматика ParseKit для HTML с заменяющими переменными
  • Как найти путь закрытия (двухстрочное пересечение) в iPhone SDK?
  • iOS - выход (0) устарел?
  • Почему addSubview: не сохранять вид?
  • Мой проект запускается только в симуляторе, но не работает в устройстве, почему?
  • На какой размер файла я должен смотреть? IPA?
  • Как отлаживать «Ошибка Xcode CodeSign: отсутствует файл прав Entitlements.plist» в Xcode 4?
  • Панель состояния iOS игнорирует supportedInterfaceOrientations в корневом контроллере
  • Interesting Posts

    Ошибка SIGABRT после последнего обновления Xamarin.iOS

    Pushkit VoiP push-уведомления пробуждают время выполнения приложения

    Как добавить границу только в верхней части UIView

    Безопасная зона iPhone X выглядит ниже Opaque Toolbar

    Можно ли изменить цвета Apple Map?

    Изменение параметра navigationController.delegate приводит к плохому доступу

    Принудительная цифровая клавиатура для полей пароля ios8

    Objective C – создание конкретных экземпляров класса из базового класса в зависимости от типа

    Обходной путь для Swift Enum с аргументами типа raw + case?

    Прокрутка UICollectionView медленная

    continueUserActivity не вызывается из поиска закрытого приложения

    iOS не распознает события кликов

    UITableView отскакивает назад в начало раздела при вызове reloadRowsAtIndexPaths

    UITableView Parallax заголовок для отображения нескольких изображений

    Уведомление об уведомлении службы IOS 10 дважды срабатывает

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.