Базовые данные не вызывают автоматически преобразователь значения при получении / установке атрибута непосредственно в коде

Если я правильно понимаю, идея трансформируемых атрибутов Core Data заключается в следующем:

  1. реализовать NSValueTransformer подкласс с возвратами [NSData class] в +transformedValueClass наряду с его реализацией для трансформации
  2. зарегистрировать трансформатор в +load или же +initialize
  3. установить атрибут объекта как трансформируемый
  4. установите имя для вашего преобразователя (имя, которое вы использовали для его регистрации) в редакторе модели 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 ответ

Решение

(Из комментария выше:) Обратный преобразователь вызывается при сохранении контекста, а не при установке атрибута.

Другие вопросы по тегам