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


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

  1. реализовать подкласс NSValueTransformer с возвратами [NSData class] в +transformedValueClass вместе с его реализацией для преобразования
  2. зарегистрируйте трансформатор в +load или +initialize
  3. задайте атрибут сущности как трансформируемый
  4. задайте имя для вашего трансформатора (имя, которое вы использовали для его регистрации) в Редакторе модели xcode для атрибута.

В этот момент я ожидаю, что что доступ или Установка атрибута в управляемом объекте соответствующего типа сущности вызовет трансформатор значений. Однако я тестирую это в приложении, которое использует AFIncrementalStore, и я получаю следующее поведение:

  • а-регистрация трансформатора в +load или +initialize не происходит кажется необходимым; основные данные находят его в любом случае (хотя читайте дальше).
  • B-fetch запросы через AFIncrementalStore вызывают трансформатор. Например, я получаю JSON обратно из запроса fetch и при составлении карты словарь ответов на объект managedObject, трансформатор срабатывает и закрывает соответствующий ключ словаря к NSData в объекте.
  • C-однако, если я попытаюсь установить или получить атрибут с помощью кода, то трансформатор не называется. То есть делать что-то вроде myManagedObject.myAttribute = @"hello" не вызывает преобразование из NSString в NSData, а также NSString *myString = myManagedObject.myAttribute не запускает преобразование из NSData в NSString.

Так что же я упускаю? Я думал, что идея заключалась в том, что CoreData будет автоматически позвони трансформатору. Или я ошибаюсь?

В соответствии с этим вопросом: Почему мой трансформируемый атрибут основных данных не использует мой пользовательский NSValueTransformer? похоже, это ошибка в рамках Apple. Но что меня сбивает с толку, так это то, что через AFIncrementalStore трансформатор ценности действительно вызывается. Может быть, ключ в том, что, устанавливая только атрибут с помощью кода, я на самом деле не запускаю AFIncrementalStore, и поэтому изменение происходит просто в памяти ?

1 2

1 ответ:

(из комментария выше:) обратный трансформатор вызывается, когда вы сохраняете контекст, не тогда, когда вы устанавливаете атрибут.