2012-02-29 9 views
2

У меня есть простой NSValueTransformer, который должен преобразовать строку first, second, third в массив. Поэтому в моей схеме CoreData у меня есть атрибут options, который я установил в Transformed и укажите свой трансформатор.CoreData ожидает строку при возврате массива и NSData при возврате строки

Это мой трансформатор:

-(id)transformedValue:(id)value{ 
    // convert it to an array 
    if(!value){ 
     return nil; 
    } else{ 
     NSString *languages = value; 
     NSArray *result = [languages componentsSeparatedByString: @", "]; 
     // return result; 
     return @"test Result"; 
    } 
} 

Теперь, когда я вернуть переменную result я получаю следующее сообщение об ошибке (length выглядит он ожидает NSString):

... 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x6cc59a0' 

Если я вернусь тест строка выше, вместо этого я получаю эту ошибку (bytes выглядит как ожидающий объект NSData):

... 'NSInvalidArgumentException', reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0xf0780' 

Похоже, есть концептуальная проблема, которую я, похоже, не понимаю. Также любопытно, что +(Class)transformedValueClass и +(BOOL)allowsReverseTransformation никогда не «касаются» при использовании отладчика.

ответ

2

Там нет ошибки в коде вы предоставляете. Проблема лежит в вашем подходе CoreData.

Когда вы используете преобразованное свойство в CoreData, значение хранится в базе данных как NSData объект. И длина в ваших ошибках связана с NSData длина метод.

Поэтому вы должны предоставить NSValueTransformer преобразование из NSData в NSArray и обратное, чтобы помещать конкатенированные массивы в CoreData как NSData.

Если вы хотите сохранить возможность сохранить собственность как NSString, вы можете осуществлять специальный аксессор для NSString собственности вашего управляемого объекта, который превратит NSString в NSArray значения или использовать NSValueTransformer за пределами вашей модели CoreData так:

+0

Но я не могу создать трансформатор, который преобразует числа от «одного» до «десяти» в числа 1 - 10. Нужно ли это NSData? – Besi

+0

Учтите, что в CoreData могут быть сохранены объекты Objective-C. Таким образом, нет чисел, кроме NSNumber, NSDate, NSString или NSData. Я не понимаю вашей главной цели, чтобы дать вам несколько советов. Но, возможно, вам стоит добавить дополнительный объект к вашей модели и отношение «один-ко-многим», чтобы добавить некоторый набор строк в вашу сущность. Это может быть более элегантное и эффективное решение. – voromax

-1

Значение должно быть отлиты в NSString попробовать это

-(id)transformedValue:(id)value{ 
    // convert it to an array 
    if(!value){ 
     return nil; 
    } else{ 
     NSString *languages = (NSString*)value; 
     NSArray *result = [languages componentsSeparatedByString: @", "]; 
     return result; 

    } 
} 
+0

Отрицательный, у меня все еще такая же ошибка, также я проверил, что результат - это фактически массив, который я ожидал в отладчике ... Я думаю, что 'NSString * languages ​​= value;' является неявным, потому что языки имеют тип NSString *. – Besi