Допустим, у меня есть приложение со следующими объектами: Page <- >> BookPosition << -> Книга. Работа моего приложения состоит в том, чтобы дать пользователям возможность смешивать и сопоставлять страницы в одной или нескольких книжках с картинками с помощью графического интерфейса пользователя (в главном потоке).
Теперь две точки:
- Когда пользователь изменяет книгу,
BookPositions
создаются и уничтожаются, но никогда не изменяются.
- Страницу можно разделить между несколькими книгами.
Допустим, я синхронизирую множество книг с картинками (некоторые уже существуют, некоторые новые) в фоновом потоке, используя общий PSC, отдельный MOC и изоляцию водонепроницаемого потока. Перед тем, как начать процесс, я проверяю, что пользователи не могут изменять ни одну книгу для синхронизации до тех пор, пока MOC в фоновом потоке не вызовет -[NSManagedObjectContext save:]
для этой книги и, соответственно, не сгенерирует NSManagedObjectContextDidSaveNotification
, который объединен в главном потоке, используя mergeChangesFromContextDidSaveNotification
:.
Я наивный, я не ожидал, что такой подход когда-либо вызовет конфликт слияния, поскольку - якобы - ни одна из рассматриваемых сущностей никогда не сможет измениться в одном потоке до того, как вызов mergeChangesFromContextDidSaveNotification:
сможет привести оба MOC до настоящего времени. Однако конфликты слияния будут возникать в фоновом потоке, если пользователи вносят изменения в основной поток, изменяющие набор позиций BookPosition, связанных со страницей, совместно используемой между уже синхронизированной книгой и книгой, подлежащей синхронизации .
Вывод здесь заключается в том, что изменение (добавление или удаление) сущностей на стороне «многие» отношения «один ко многим» приводит к новой версии объекта на стороне «один», даже если на «одна» сторона изменилась. Пока что все имеет смысл, и я решил, что смогу решить проблему, установив политику слияния (либо NSMergeByPropertyStoreTrumpMergePolicy
, либо NSMergeByPropertyObjectTrumpMergePolicy
здесь должно работать?) На фоне MOC. К сожалению (и неожиданно), после настройки политики слияния я столкнулся с конфликтами в главном потоке, именно поэтому я запутался.
Я хотел бы знать, в какой момент данные в моем постоянном хранилище не синхронизируются с моим MOC в главном потоке. Происходит ли расхождение во время сохранения фонового MOC / до того, как он сможет опубликовать NSManagedObjectContextDidSaveNotification
?
Кажется, я могу решить проблему, также установив политику слияния в основном MOC, но, если возможно, я бы хотел точно знать, что здесь происходит.