Я в итоге заставил его работать (лучше спать на нем). Были две проблемы. Первым было то, что я указал один и тот же преобразователь значения как в привязках IB, так и в базовой модели данных, и он был избыточным.
Насколько я понимаю, привязки IB для указанных преобразователей значений фактически преобразуют значения между представлениями и контроллерами, тогда как преобразователь значений данных ядра действует как посредник между управляемыми объектами и постоянным хранилищем.
Что еще хуже, вторая проблема заключалась в том, что мой стоимостной преобразователь был перевернут. Сообщение transformValue
отправляется при сохранении объектов (управляемый объект -> хранилище), а сообщение reverseTransformedValue
отправляется при загрузке значений из хранилища, что несколько противоположно направлению преобразователей, используемых при привязке объектов вида к объектам модели. , Я получил подсказку из руководства по программированию основных данных , где вы можете прочитать следующую загадочную заметку:
Важное замечание: Хотя преобразователь по умолчанию является преобразователем, указанным NSKeyedUnarchiveFromDataTransformerName, этот преобразователь фактически используется в обратном порядке. Если вы укажете преобразователь по умолчанию явно, Core Data будет использовать его «в неправильном направлении».
Несмотря на то, что моя программа работает до сих пор, я хотел бы получить подтверждение от кого-то с опытом работы с основными данными, и я был бы признателен, если бы вы указали мне некоторые документы по этому вопросу, которые я мог бы пропустить.
Заранее спасибо.
Рабочий код:
+ (Class)transformedValueClass
{
return [NSData class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)reverseTransformedValue:(id)value
{
if (value == nil) return nil;
return [[[NSImage alloc] initWithData:value] autorelease];
}
- (id)transformedValue:(id)value
{
if (value == nil) return nil;
if(![value isKindOfClass:[NSImage class]])
{
NSLog(@"Type mismatch. Expecting NSImage");
}
NSBitmapImageRep *bits = [[value representations] objectAtIndex: 0];
NSData *data = [bits representationUsingType:NSPNGFileType properties:nil];
return data;
}