Dans Xcode 6 beta 4 (iOS 8), pourquoi Core Data ne conserve pas les champs UIImage dans le backend comme dans iOS 7 quand je le déclare Transformable?

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).

entrez la description de l'image ici

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 .