Спасибо Маркусу за подсказку, что это петля!Но этот цикл не был вызван наблюдателем для уведомления.
Причиной цикла является ошибка (я думаю, что она одна) в CoreData: одна из сущностей, сохраненных в этой ситуации, имеетсвойство типа Double
.И стоимость имущества была изменена.Поэтому CoreData сравнивает сохраненное значение с кэшированным значением, и иногда десятичные цифры заставляют CoreData NSSQLCore
«думать», что сохраненные значения были изменены извне.
Обычно это приводит к сбою метода save:
и вернуть NSError
, но в моем случае настроил NSManagedObjectContext
для использования политики слияния NSMergeByPropertyObjectTrumpMergePolicy
.Поэтому, поскольку CoreData ложно полагает, что произошли внешние изменения, он просто принимает значение свойства в памяти (которое имеет некоторые «неблагоприятные» цифры) и сохраняет его.После этого он сравнивает сохраненное значение со значением в памяти и снова обнаруживает неравенство, выполняет откат и снова сохраняет значение - это цикл.
Поскольку я заставляю свойство Double
хранить NSNumber
объекты, которые содержат целочисленные значения, save:
успешно.
Эта ссылка текст ссылки помогла мне найти выход.
Я НЕ CoreData
специалист, так что я не уверен, что все правильно объяснили.