Работа с несколькими контекстами управляемых объектов Вопросы - PullRequest
1 голос
/ 13 июля 2011

В настоящее время я выполняю несколько сетевых запросов через несколько потоков, выполняющихся параллельно, поэтому у меня есть контекст управляемого объекта для каждого потока, и каждый поток устанавливает значения атрибутов для сущностей базовых данных.Итак, вот дилемма: каждый сетевой запрос получает небольшие объемы данных за раз, и есть сотни (или даже тысячи) этих запросов, и я хочу выполнить сохранение после того, как все сетевые операции произошли (так что я могу смело предположить,сохраненные данные означают, что все было успешно загружено и записано для хранения).Итак, два вопроса:

  1. Сохраняю ли я каждый контекст управляемого объекта после того, как каждый поток завершил запись в контекст, или я сохраняю все контексты управляемого объекта в памяти и в конце перебираю все из них?и выполнять сохранения?(После этого стало очевидно, что экономия на ходу будет более эффективным методом, но я все равно хотел бы услышать ваши мысли.)
  2. Есть ли способ объединить контексты управляемого объекта, не выполняясохранить операцию?В настоящее время я объединяю контексты с помощью уведомления NSManagedObjectContextDidSaveNotification, и мне было интересно, есть ли другой способ.

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Я не вижу, как вы можете «сохранить все контексты управляемых объектов в памяти, а в конце просмотреть все их и выполнить сохранения».Каждый MOC должен быть ограничен потоком, в котором он создан, поэтому я не вижу, как вы можете эффективно перебирать все MOC, не нарушая этого правила ограничения ... Но вы, вероятно, уже поняли, что ...

Iтакже считают, что объединение MOC через NSManagedObjectContextDidSaveNotification является наиболее эффективным методом.Я бы даже сказал, что проще всего сохранять MOC после каждой вставки объекта (например, когда вы импортируете данные).Таким образом вы минимизируете объем каждого слияния!А так как слияния выполняются в памяти, то в них мало накладных расходов, так как они более детализированы.

0 голосов
/ 13 июля 2011

Вы можете создать класс контроллера для всех потоков и использовать только один управляемый контекст для сохранения ваших данных.

После завершения загрузки потока вызовите делегата в вашем ThreadControlerClass, объедините данные со старыми данными и затем сохраните, когда все потоки завершат загрузку.Если ваши данные слишком велики, вы можете сделать промежуточные сохранения.

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