Основные многопоточные отношения хранилища данных
Моя проблема очень странная, и я прошу помощи. Я хочу объяснить вам, как работает моя система. У меня есть две проблемы с этим.
Я делаю заявление, у которого есть две таблицы. Я использую основные данные. Таблицы являются категориями и продуктами, в основных данных, которые я установил, отношение "один ко многим" может относиться к нескольким товарам, в товаре может быть одна категория.
Вот базовая схема
Category {
site_id
name
allProducts ->> Product
}
Product {
site_id
name
category -> Category
}
- это простейшая модель продуктов и категорий имеет больше свойств
В этом приложении у меня есть процесс обновления, и этот процесс работает в фоновом потоке. Я создал контекст для этой темы и все изменения, которые я храню в этом контексте.
Все вычисления, которые я выполняю в фоновом потоке в
[context performBlock:^{
// all my operations for updating storing categories and products
}]
Это поток процесса обновления
- С сервера получите JSON с данными категории
- С сервера получите JSON с данными о товарах
С сервера получите JSON с информацией о том, какая категория и какие продукты
array((category_site_id > array(product_site_id1, product_site_id2...))
Пройдите через категории JSON и сохраните сущность категории, я получаю name и site_id из JSON, создаю сущность и устанавливаю эти свойства
Пройдите через продукты JSON и создайте сущность продукта и задайте имя и store_id из свойств из JSON
Тогда основная часть
- Теперь мне нужно подключить продукт к категориям, основанным на 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
Мой совет по этому вопросу - использовать контекст, напрямую связанный с координатором магазина, а не дочерний контекст. Все будет хорошо работать с такой настройкой. Вы можете использовать контекст частной очереди, конечно.