CoreData s'attend à une chaîne lors du retour d'un tableau et NSDATA lors du retour d'une chaîne
-
14-11-2019 - |
Question
J'ai un simple NSValueTransformer
Cela devrait convertir une chaîne séparée par des virgules first, second, third
dans un tableau. Donc, dans mon schéma coredata j'ai l'attribut options
que je me suis installé Transformed
et spécifiez mon transformateur.
C'est mon transformateur:
-(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";
}
}
Maintenant, quand je retourne la variable result
J'obtiens l'erreur suivante (length
On dirait qu'il s'attend à un NSString
):
... 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x6cc59a0'
Si je renvoie la chaîne de test ci-dessus à la place, j'obtiens cette erreur (bytes
On dirait qu'il s'attend à un NSData
objet):
... 'NSInvalidArgumentException', reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0xf0780'
Il semble qu'il y ait un problème conceptuel que je ne semble pas saisir. Aussi curieusement +(Class)transformedValueClass
et +(BOOL)allowsReverseTransformation
ne sont jamais "touchés" lors de l'utilisation du débogueur.
La solution
Il n'y a pas d'erreurs dans le code que vous fournissez. Le problème réside dans votre approche coredata.
Lorsque vous utilisez une propriété transformée dans coredata, la valeur est stockée dans la base de données comme Nsdata objet. Et la longueur de vos erreurs est liée à Longueur nsdata méthode.
Par conséquent, vous devez fournir à NSvalutRansformateur avec une transformation de NSDATA en NSARRAY et inverser pour mettre des tableaux concaténés en coredata comme nsdata.
Si vous souhaitez conserver la possibilité de stocker la propriété en tant que NSString, vous pouvez implémenter un accessoire spécial sur la propriété NSString de votre objet géré, qui transformera le NSString en valeur NSARAY ou utilisera votre NSValuetRansformateur en dehors de votre modèle de coredata comme ceci:
NSValueTransformer *transformer = [NSValueTransformer valueTransformerForName:@"StringToArrayValueTransformer"];
NSArray *array = [transformer transformedValue:yourEntityItem.yourStringProperty];
Autres conseils
La valeur doit être jetée à un nsstring essayez ceci
-(id)transformedValue:(id)value{
// convert it to an array
if(!value){
return nil;
} else{
NSString *languages = (NSString*)value;
NSArray *result = [languages componentsSeparatedByString: @", "];
return result;
}
}