NSManagedObjectContext путаница - PullRequest
       6

NSManagedObjectContext путаница

7 голосов
/ 09 января 2012

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

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

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

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

и ...

Например, допустим, я внес изменения в контекст A и внесу некоторые другие изменения в контекст B. Затем я сначала вызываю save для A, а затем B?будет преобладать B?

Спасибо

Ответы [ 2 ]

11 голосов
/ 09 января 2012

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

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

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

Для вопроса № 2 ответ на вопрос, кто преобладает, будет зависеть от политики слияния , которую вы задали для своего контекста, и какой из них называется последним, который будет B. Вот политики слияния, которые можно установить это повлияет на второй контекст, который будет сохранен.

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

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

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

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

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

2 голосов
/ 09 января 2012

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

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

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

[contextB mergeChangesFromContextDidSaveNotification:notification];

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

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

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