Dans le model de données de mon projet iOS, j'ai une entité appelée Foo
qui a une image
champ. J'ai toujours stocké ce champ en utilisant le paramètre Transformable
sorte NSCoding
utilise automatiquement NSCoding
pour stocker l'image.
Cependant, j'ai trouvé que lorsque j'essaie de le récupérer, le UIImage *
qui en sort est corrompu. Il a la taille CGSizeZero
plupart du time et ne contient pas de données valides.
Quelqu'un a-t-il déjà expérimenté cela sous Xcode 6 beta 4?
NB: J'utilise MagicalRecord pour configurer la stack de données de base. J'ai utilisé la stack de données de base dite «auto-migrant». Je Reset Content and Settings
chaque fois que je lance ce test sur le simulateur.
J'ai également essayé de reproduire le problème sur un magasin de données en memory (de telle sorte qu'il est susceptible de tests unitaires) mais je ne peux pas reproduire correctement le problème (parce que je n'ai pas pu démonter la stack et l'initialiser à nouveau).
J'ai également rencontré cela avec iOS 8, après avoir bien travaillé avec iOS 7. Mon problème était que j'essayais de définir les propriétés de l'image sur plusieurs NSManagedObjects en référençant directement une seule image source dans mon bundle; la solution consiste à définir les propriétés sur les copys de l'image source.
Détails: Mon application permet aux users de définir une propriété d'image des joueurs (NSManagedObjects) dans une équipe. La propriété d'image, bien sûr, est un atsortingbut transformable. L'user peut soit capturer une photo ou choisir un avatar, qui est enregistré en tant que .jpeg dans mon lot. Pour l'avatar, je mettais la propriété avec
player.photo = [UIImage imageNamed@"avatar.jpg"];
Plusieurs joueurs avaient souvent le même avatar. Ce n'était pas du tout un problème avec iOS 7, et j'ai même travaillé avec iOS 8 tant que tous les objects étaient en memory. Mais avec iOS 8, les images d'avatar ne restraient pas dans datatables de base après la fin de l'application; Lors de la relance, toutes les images étaient de longueur nulle et affichaient un espace vide (cela ressemble beaucoup au comportement que vous voyez).
Le correctif consistait à définir la propriété sur une copy de l'image source avec les éléments suivants:
UIImage *avatar = [UIImage imageNamed:@"avatar.jpg"]; player.photo = [UIImage imageWithCGImage:avatar.CGImage];
Je peux voir pourquoi l'exécution manuelle de la transformation semblerait être la solution, parce que vous seriez en train de définir un object unique pour chaque propriété d'image … mais le correctif réel (dans mon cas, au less) était beaucoup plus facile.
Après quelques searchs, il s'avère que dans iOS 8, UIImage
est maintenant conforme à NSSecureCoding
au lieu du NSCoding
normal. Je soupçonne que c'est le changement d'implémentation sous-jacente qui provoque le paramétrage de Transformable
dans notre model de données pour ne pas fonctionner comme avant.
La solution consiste simplement à prendre la transformation entre nos mains. Une telle façon de faire est d'écrire notre propre transformateur, décrit dans cette réponse SO .