将UIImage保存到核心数据

时间:2015-04-22 05:46:53

标签: core-data uiimage

我正在尝试将图像保存在Core Data上。属性类型是" Transformable"。当我使用以下句子时:

// NOTHING SAVED
entity.image = [UIImage imageNamed:@"a.jpg"];
[self saveContext];

没有保存任何内容。但请将以上句子替换为以下内容:

entity.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"a" ofType:@"jpg"]];
[self saveContext];

OR

entity.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://some_url/a.jpg"]]];
[self saveContext];

OR

entity.image = UIImagePNGRepresentation([UIImage imageNamed:@"a.jpg"]);
[self saveContext];

它有效!!! 太奇怪了。我非常肯定[UIImage imageNamed:@" a.jpg"]正常返回。谁知道发生了什么? PLS。

我的Xcode是6.3

谢谢。

1 个答案:

答案 0 :(得分:3)

这是非常奇怪的行为。我不认为有任何东西可以完全解释这一点,但我会看到我能做些什么。

imageNamed:调用与其他创建图像的方式不同,因为它使用自动图像缓存。当您使用imageNamed:加载图片时,它会自动缓存,以便可以快速重复使用。预期用途是用于大量使用的图像,例如UI元素。它也适用于您只使用一次的图像,但在这种情况下没有真正的优势。

因此,imageNamed:在内部执行的内容与其他图像创建方法不同。根据你的结果(我得到同样的东西,BTW),这导致图像的工作方式不同,至少在某些时候。但是当你有一个UIImage时,似乎没有办法询问它是如何创建的,或者它是否代表一个缓存的图像。

我认为这是一个错误,我建议将其报告给Apple。与此同时,您有一个解决方法。作为安全检查,做这样的事情可能是个好主意,以避免意外地遇到问题:

UIImage *image = // loaded in whatever way you want
entity.image = [UIImage imageWithCGImage:image.CGImage];

该步骤应该是不必要的。但是,正如您所发现的,有时候正确的方式是行不通的。

[如果Apple的任何人看到这个:报告为rdar:// 20717042]