Основные проблемы многопоточности данных - PullRequest
0 голосов
/ 25 сентября 2019

Я внедрил базовые данные в многопоточную среду, у меня есть некоторые сомнения и проблемы, связанные с ними, которые я перечисляю ниже: -

  1. В нескольких блогах и ответах SO говорится, что у вас должен быть один NSPersistentStoreCoordinator (PSC), но, насколько я понимаю, 'PSC' должно быть равно количеству ManagedObjectModel.Пожалуйста, исправьте меня, если я ошибаюсь.
  2. Согласно документу, объекты ManagedObjectContext должны быть равны количеству потоков, которые мы создаем для выполнения действия в конкретной модели.К моему удивлению, я использовал один объект ManagedObjectContext из разных потоков и выполнял действие извлечения одновременно без какого-либо сбоя, пожалуйста, найдите код ниже: -

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

func fetchUserDetail(productId : Int) -> User_Details?  {

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "User_Details")
    do {
        fetchRequest.predicate = NSPredicate(format: "product_id == %d", productId)

        let results:[User_Details]? = try (singleinstancemanagedObjectContext.fetch(fetchRequest) as? [User_Details])

        if let results = results {
            ..... logic .....
        }
    } catch let error as NSError {
    }
    return nil

}

1 Ответ

0 голосов
/ 25 сентября 2019
  1. «NSPersistentStoreCoordinator» может обрабатывать только один NSManagedObjectModel.Вы здесьНо наличие нескольких «NSPersistentStoreCoordinator» требует нескольких «NSManagedObjectModel» (файлы .xcdatamodeld).Этот случай очень редкий.

  2. Сбои параллелизма по своей природе неуловимы.Они происходят только тогда, когда несколько потоков обращаются к одним и тем же данным одновременно с точностью до нано секунды.Это трудные для отладки ошибки, которые обычно возникают в работе, когда сотни пользователей используют приложение.Последнее, что вы хотите сказать пользователю, - мы потеряли все ваши данные (были повреждены или потерпели крах).Так что вам лучше послушать документацию здесь.Мы сделали ту же ошибку, передавая NSManagedObjects между различными потоками в одном из наших старых приложений, и заплатили цену.Рефакторинг кода занял много времени.Наконец, из Руководства по программированию основных данных link .

Конфигурация NSPrivateQueueConcurrencyType создает свою собственную очередь при инициализации и может использоваться только в этой очереди.Поскольку очередь является частной и внутренней по отношению к экземпляру NSManagedObjectContext, доступ к ней можно получить только через executeBlock: и executeBlockAndWait: методы.

Вот еще одно с той же страницы,

Экземпляры NSManagedObject не предназначены для передачи между очередями.Это может привести к повреждению данных и прекращению работы приложения.Когда необходимо передать ссылку на управляемый объект из одной очереди в другую, это необходимо сделать с помощью экземпляров NSManagedObjectID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...