Базовые данные не вызывают автоматически преобразователь значения при получении / установке атрибута непосредственно в коде
Если я правильно понимаю, идея трансформируемых атрибутов Core Data заключается в следующем:
- реализовать
NSValueTransformer
подкласс с возвратами[NSData class]
в+transformedValueClass
наряду с его реализацией для трансформации - зарегистрировать трансформатор в
+load
или же+initialize
- установить атрибут объекта как трансформируемый
- установите имя для вашего преобразователя (имя, которое вы использовали для его регистрации) в редакторе модели xcode для атрибута.
На данный момент, я ожидаю, что доступ или установка атрибута в managedObject соответствующего типа объекта вызовет преобразователь значения. Тем не менее, я тестирую это в приложении, которое использует AFIncrementalStore
и я получаю следующее поведение:
- А - регистрация трансформатора в
+load
или же+initialize
не кажется необходимым; Базовые данные все равно его находят (хотя и читают заранее). - B - получать запросы через
AFIncrementalStore
вызвать трансформатор. Например, я возвращаю JSON из запроса на выборку, и при отображении словаря ответов на управляемый объект запускается преобразователь, который закрывает соответствующий ключ словаря дляNSData
в объекте. - C - ОДНАКО, если я пытаюсь установить или получить атрибут с помощью кода, преобразователь не вызывается. Это делает что-то вроде
myManagedObject.myAttribute = @"hello"
не запускает преобразование изNSString
вNSData
и ни один не делаетNSString *myString = myManagedObject.myAttribute
вызвать преобразование изNSData
вNSString
,
Так чего мне не хватает? Я думал, что идея в том, что CoreData будет автоматически вызывать преобразователь. Я ошибся?
В соответствии с этим вопросом: почему мой трансформируемый атрибут Core Data не использует мой собственный NSValueTransformer? это похоже на ошибку в рамках Apple. Но что меня отталкивает, так это то, что через AFIncrementalStore вызывается преобразователь значения. Может быть, ключ в том, что, устанавливая только атрибут с помощью кода, я на самом деле не запускаю AFIncrementalStore, и поэтому изменение происходит только в памяти?
1 ответ
(Из комментария выше:) Обратный преобразователь вызывается при сохранении контекста, а не при установке атрибута.