Добавление в качестве ответа, поскольку оно стало учебным упражнением.Надеюсь, кому-то еще это будет полезно.
Приложение использует архитектуру множественного управляемогоObjectContext (moc).1 приватный moc для внесения изменений и 1 moc основного потока, который синхронизируется с помощью mergeChanges .
. В приведенном выше коде navigationItem
использует экземпляр папки, хранящийся в main-moc.DynamicProperty прослушивает изменения KVO в экземпляре папки этого основного moc.Давайте назовем эту главную папку.Когда я делаю изменения, я изменяю экземпляр папки, которую мы имеем на private-moc.Давайте назовем это private-folder.
При изменении private-folder и вызове save
на private-moc, передается уведомление с именем NSManagedObjectContextDidSave
.main-moc синхронизирует себя с помощью mergeChanges.
mergeChanges изменяет основную папку, но обратите внимание, что она никогда не вызовет computed-property-setter availability
.Он напрямую меняет internalAvailability
.
. Таким образом, уведомления KVO о нашем вычисленном свойстве не публикуются.
TL; DR При выполнении KVO для NSManagedObjectподкласс, используйте сохраненное свойство вместо вычисленного.Если у вас есть сценарий multi-moc (контекст управляемого объекта) и вы используете mergeChanges для синхронизации, метод setter для вашего вычисленного свойства не вызывается при синхронизации.
Edit (Solution): добавить метод шаблона keyPathsForValuesAffecting<KeyName>
КВО соответствующую документацию
@objc class func keyPathsForValuesAffectingAvailability() -> Set<NSObject> {
return [#keyPath(Folder.internalAvailability) as NSObject]
}