Когда возникают конфликты при слиянии Core Data? - PullRequest
1 голос
/ 22 декабря 2011

Допустим, у меня есть приложение со следующими объектами: Page <- >> BookPosition << -> Книга. Работа моего приложения состоит в том, чтобы дать пользователям возможность смешивать и сопоставлять страницы в одной или нескольких книжках с картинками с помощью графического интерфейса пользователя (в главном потоке).

Теперь две точки:

  1. Когда пользователь изменяет книгу, BookPositions создаются и уничтожаются, но никогда не изменяются.
  2. Страницу можно разделить между несколькими книгами.

Допустим, я синхронизирую множество книг с картинками (некоторые уже существуют, некоторые новые) в фоновом потоке, используя общий PSC, отдельный MOC и изоляцию водонепроницаемого потока. Перед тем, как начать процесс, я проверяю, что пользователи не могут изменять ни одну книгу для синхронизации до тех пор, пока MOC в фоновом потоке не вызовет -[NSManagedObjectContext save:] для этой книги и, соответственно, не сгенерирует NSManagedObjectContextDidSaveNotification, который объединен в главном потоке, используя mergeChangesFromContextDidSaveNotification:.

Я наивный, я не ожидал, что такой подход когда-либо вызовет конфликт слияния, поскольку - якобы - ни одна из рассматриваемых сущностей никогда не сможет измениться в одном потоке до того, как вызов mergeChangesFromContextDidSaveNotification: сможет привести оба MOC до настоящего времени. Однако конфликты слияния будут возникать в фоновом потоке, если пользователи вносят изменения в основной поток, изменяющие набор позиций BookPosition, связанных со страницей, совместно используемой между уже синхронизированной книгой и книгой, подлежащей синхронизации .

Вывод здесь заключается в том, что изменение (добавление или удаление) сущностей на стороне «многие» отношения «один ко многим» приводит к новой версии объекта на стороне «один», даже если на «одна» сторона изменилась. Пока что все имеет смысл, и я решил, что смогу решить проблему, установив политику слияния (либо NSMergeByPropertyStoreTrumpMergePolicy, либо NSMergeByPropertyObjectTrumpMergePolicy здесь должно работать?) На фоне MOC. К сожалению (и неожиданно), после настройки политики слияния я столкнулся с конфликтами в главном потоке, именно поэтому я запутался.

Я хотел бы знать, в какой момент данные в моем постоянном хранилище не синхронизируются с моим MOC в главном потоке. Происходит ли расхождение во время сохранения фонового MOC / до того, как он сможет опубликовать NSManagedObjectContextDidSaveNotification?

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

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