在Xcode 6 beta 4(iOS 8)中,为什么Core Data不会像在iOS 7中声明的那样将UIImage字段保留到后端,当我声明它是Transformable时?

在我的iOS项目的数据模型中,我有一个名为Foo的实体,它有一个场image 。 我总是使用Transformable设置存储此字段,以便iOS自动使用NSCoding存储图像。

但是,我发现当我尝试检索它时,出来的UIImage *已经损坏了。 它大部分时间都具有CGSizeZero大小,并且不包含有效数据。

在Xcode 6 beta 4下有没有人经历过这个?

注意:我正在使用MagicalRecord来设置核心数据堆栈。 我使用了所谓的“自动迁移”核心数据堆栈。 我每次在模拟器上运行此测试时都会Reset Content and Settings

我也试图在内存数据存储中重现这个问题(这样它可以进行unit testing)但我无法准确地重现问题(因为我无法拆除堆栈并再次初始化它)。

在此处输入图像描述

在我的应用程序与iOS 7正常工作之后,我也遇到了这个问题。我的问题是我试图通过直接引用我的包中的单个源图像来设置多个NSManagedObjects上的图像属性; 解决方案是将属性设置为源图像的副本。

详细信息:我的应用程序允许用户在团队中设置玩家(NSManagedObjects)的图像属性。 当然,image属性是一个可转换的属性。 用户可以捕获照片或选择一个头像,该头像在我的包中保存为.jpeg。 对于头像,我正在设置属性

 player.photo = [UIImage imageNamed@"avatar.jpg"]; 

多个玩家通常拥有相同的头像。 这根本不是iOS 7的问题,只要所有对象都在内存中,甚至可以使用iOS 8。 但是对于iOS 8,在应用程序终止后,头像图像不会持久存储到核心数据中; 重新启动后,所有图像都是零长度并显示空白区域(听起来很像您所看到的行为)。

修复方法是使用以下内容将属性设置为源图像的副本

 UIImage *avatar = [UIImage imageNamed:@"avatar.jpg"]; player.photo = [UIImage imageWithCGImage:avatar.CGImage]; 

我可以看到为什么手动执行转换似乎是解决方案,因为你要为每个图像属性设置一个唯一的对象……但真正的修复(至少在我的情况下)要容易得多。

经过一番调查后发现,在iOS 8中, UIImage现在符合NSSecureCoding而不是普通的NSCoding 。 我怀疑底层实现的变化导致我们的数据模型中的Transformable设置不能像以前一样工作。

解决方案就是掌握自己的变革。 一种这样的方法是编写我们自己的变压器, 在这个SO答案中概述 。