Основные данные не вызывают автоматически преобразователь значения при получении / установке атрибута непосредственно в коде
Если я правильно понимаю, идея, лежащая в основе основных трансформируемых атрибутов данных, такова:
- реализовать подкласс
NSValueTransformer
с возвратами[NSData class]
в+transformedValueClass
вместе с его реализацией для преобразования - зарегистрируйте трансформатор в
+load
или+initialize
- задайте атрибут сущности как трансформируемый
- задайте имя для вашего трансформатора (имя, которое вы использовали для его регистрации) в Редакторе модели 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, и поэтому изменение происходит просто в памяти ?