Многопоточные отношения хранилища Core Data

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

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

Вот основная схема

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 и сохранить сущность категории,Я получаю имя и идентификатор сайта _из JSON, создаю объект и устанавливаю эти свойства

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

Затем основная часть

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

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

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

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

[category setAllProducts :results] // результаты представляют собой NSSet продукта, категория представляет собой объект объекта

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

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

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

И ТОГДА, КОГДА Я ОСТАНАВЛИВАЮ ПРИЛОЖЕНИЕ И ЗАПУСКУ ЕГО СНОВА, Я МОГУ УВИДЕТЬ ПРОДУКТЫ В КАТЕГОРИЯХ:(

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

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

5
задан Milos Glavinić 10 August 2012 в 10:33
поделиться