将UIImage保存到Core Data

3

我想要在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];

或者

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

或者

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

成功了!!! 太奇怪了。我非常确定 [UIImage imageNamed:@"a.jpg"] 正常返回。有人知道发生了什么吗?请告诉我。

我的Xcode版本是6.3

谢谢。

1个回答

3

这是非常奇怪的行为。我认为没有任何东西可以完全解释这个问题,但我会尽力而为。

imageNamed: 调用与其他创建图像的方法不同,它利用了自动图像缓存。当您使用 imageNamed: 加载图像时,它会自动缓存,以便快速重复使用。目标用途是用于经常使用的图像,例如 UI 元素。它也适用于您仅使用一次的图像,但在这种情况下没有真正的优势。

因此,imageNamed: 在内部执行的操作与其他图像创建方法不同。根据您的结果(顺便说一句,我也得到了同样的结果),这导致了一个工作方式不同的图像,至少有些时候是这样。但是,当您拥有一个 UIImage 时,似乎没有任何方法可以询问它是如何创建的或者它是否表示一个缓存的图像。

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

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

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

[如果苹果公司的任何人看到这个问题:请参考 rdar://20717042]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接