7

Я узнаю о CoreData. Очевидно, что одним из основных классов, к которым вы присоединились, является NSManagedObjectContext. Я не понимаю, какую именно роль в этом играет. Из прочитанных статей кажется, что вы можете иметь несколько NSManagedObjectContexts. Означает ли это, что NSManagedObjectContext в основном является копией бэкэнда?NSManagedObjectContext confusion

Как это будет разрешаться в последовательном бэкэнде при наличии нескольких разных копий?

Итак, 2 вопроса: в основном

Является NSManagedContext копию серверной базы данных?

и ...

Например, сказать, что я внести изменения в контекст и сделать некоторые другие изменения в контексте B. Тогда я зову сэкономить на первом, а затем B? будет ли Б преобладать?

Благодаря

ответ

11

NSManagedObjectContext не является копией серверной базы данных. documentation описывает его как блокнот

Экземпляр NSManagedObjectContext представляет собой единый объект « пространства» или блокнотные в приложении. Его основная задача - для управления коллекцией управляемых объектов. Эти объекты образуют группу связанных объектов модели, которые представляют собой внутренне согласованный вид одного или нескольких постоянных хранилищ. Один экземпляр управляемого объекта существует в одном и только одном контексте, но несколько копий объекта могут существовать в разных контекстах. Таким образом, объектная привязка привязана к конкретному контексту .

NSManagedObjectContext - это всего лишь временное место для внесения изменений в управляемые объекты транзакционным способом. Когда вы вносите изменения в объекты в контексте, это не влияет на бэкэнд-базу данных до тех пор, пока вы не сохраните контекст, и, как вы знаете, у вас может быть несколько контекстов, которые вы можете внести в изменения, которые действительно важны для concurrency.

Для вопроса номер 2 ответ для преобладающего будет зависеть от merge policy, который вы задали для своего контекста и который называется последним, который будет равен B. Ниже приведены политики объединения, которые могут быть установлены, что повлияет на второй контекст для сохранения.

NSErrorMergePolicyType
Определяет политику, которая вызывает сбой сохранения , если есть какие-либо конфликтов слияния.

NSMergeByPropertyStoreTrumpMergePolicyType
Определяет политику, которая объединяет конфликтов между версией Упорного магазина объекта и текущей версией в оперативной памяти, отдавая предпочтение внешних изменений.

NSMergeByPropertyObjectTrumpMergePolicyType
Определяет политику, которая сливает конфликты между напористым магазином версией объекта и текущей версией в памяти, отдавая приоритет изменений в памяти.

NSOverwriteMergePolicyType
Определяет политику, переписывает состояние в постоянном хранилище для измененных объектов в конфликта.

NSRollbackMergePolicyType
Определяет политику, выкидывает в памяти изменения состояния для объектов, находящихся в конфликте.

+0

«параллелизм». ссылка истекла. –

+0

@ Mr.UB Решено, спасибо. – Joe

2

NSManagedObjectContext - это конкретное представление вашей модели данных. Каждый контекст поддерживает свое собственное состояние (например, контекст), поэтому изменения в одном контексте не будут напрямую влиять на другие контексты. Когда вы работаете с несколькими контекстами, вы несете ответственность за их согласование путем слияния изменений, когда контекст сохраняет свои изменения в хранилище.

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

Когда вы сохраняете контекст, он будет публиковать различные уведомления о прогрессе. В вашем случае, если [contextA save:&error] удастся, контекст отправит уведомление NSManagedObjectContextDidSaveNotification. Если у вас есть несколько контекстов, вы обычно наблюдать это уведомление и называют:

[contextB mergeChangesFromContextDidSaveNotification:notification]; 

Это объединит изменения, сохраненные на contextA в contextB.

РЕДАКТИРОВАТЬ: удалил комментарий «потокобезопасный». NSManagedObjectContext не является потокобезопасным.