Основные многопоточные отношения хранилища данных

Моя проблема очень странная, и я прошу помощи. Я хочу объяснить вам, как работает моя система. У меня есть две проблемы с этим.

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

Вот базовая схема

Category {
  site_id
  name
  allProducts ->> Product
}

Product {
  site_id
  name
  category -> Category
}
  • это простейшая модель продуктов и категорий имеет больше свойств

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

Все вычисления, которые я выполняю в фоновом потоке в

[context performBlock:^{
  // all my operations for updating storing categories and products
}]

Это поток процесса обновления

  1. С сервера получите JSON с данными категории
  2. С сервера получите JSON с данными о товарах
  3. С сервера получите JSON с информацией о том, какая категория и какие продукты array((category_site_id > array(product_site_id1, product_site_id2...))

  4. Пройдите через категории JSON и сохраните сущность категории, я получаю name и site_id из JSON, создаю сущность и устанавливаю эти свойства

  5. Пройдите через продукты JSON и создайте сущность продукта и задайте имя и store_id из свойств из JSON

Тогда основная часть

  1. Теперь мне нужно подключить продукт к категориям, основанным на JSON, полученном на шаге 3, и здесь есть проблема.

Я иду в категорию foreach из JSON и получаю все продукты site_id как NSArray, я использую запрос выборки с критериями предиката и IN, чтобы получить все объекты продуктов из контекста, которые имеют массив site_id IN. Но я всегда получал ноль результатов. Это странно, потому что я вызываю результаты выборки для контекста в фоновом потоке, и я также обновил этот контекст в шагах 3 и 4.

Затем я попробую следующую вещь, до шага 6 я [context save:&error] и добавил режим сна примерно на 30 секунд, и когда после выполнения этой программы на шаге 6 все рабочие результаты оказались бесполезными, мои результаты выборки получают продукты с предикатом с критериями IN. Это моя первая проблема, если вы меня понимаете, я не могу получить товары по идентификаторам, мне нужно подождать около 30 секунд, чтобы сохранить контекст в SQLLiteDB, это очень странно. Также это странно, потому что когда я хочу получить категорию с запросом на выборку по идентификатору, я могу получить ее без проблем (возможно, это потому, что шаг 5 занимает около минуты).

Моя следующая проблема - когда я жду эти 30 секунд и затем прохожу категории проблем. На основе категории site_id я получаю сущность Category из контекста, а также на шаге 6 я получаю все товары на основе site_ids продукта, полученные с помощью JSON и запрашиваю запрос, и теперь я хочу добавить товары в категорию, и я вызываю следующий

[категория setAllProducts: результаты] // результаты - NSSet продукта, категория - объект объекта

NSError *error = nil; [сохранение контекста:& ошибка];

и я делаю это foreach categoryroy (получено в шаге 3 от сервера в формате JSON)

когда все сделано, я не могу видеть продукты в категориях на интерфейсе. Я также жду некоторое время, чтобы все данные были сохранены в БД, но ничего не происходит,

И тогда, когда я прекращаю приложение и запускаю его снова, я могу видеть продукты в категориях:(

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

большое спасибо

1 ответ

Решение

Насколько я понимаю, вы используете детский контекст. Дочерний контекст зависит от многих (многих!) Ошибок, с которыми вам приходится иметь дело.

Довольно хорошая статья на эту тему здесь:

http://wbyoung.tumblr.com/post/27851725562/core-data-growing-pains

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

Другие вопросы по тегам