2015-04-22 121 views
3

我試圖在Core Data上保存圖像。屬性類型是「Transformable」。當我使用以下句子:將UIImage保存爲核心數據

// 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

謝謝。

回答

3

這是奇怪的行爲。我不認爲有任何解釋完全的東西,但我會看看我能做些什麼。

imageNamed:調用與創建圖像的其他方式不同,它利用自動圖像緩存。當您使用imageNamed:加載圖像時,它會自動緩存,因此可以快速重新使用。預期用途是用於很多圖像,如UI元素。它也適用於你只用過一次的圖像,但在這種情況下沒有真正的優勢。

因此,imageNamed:內部比其他圖像創建方法做不同的東西。根據你的結果(我得到同樣的結果,順便說一句),這會導致圖像的工作方式不同,至少在某些時候。但是當你有一個UIImage時,似乎沒有辦法問它它是如何創建的,或者它是否代表緩存圖像。

我認爲這是一個錯誤,我建議將它報告給Apple。與此同時,你有一個解決方法。作爲一項安全檢查可能是一個好主意,做這樣的事情,來避免運行到問題意外:

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

這一步應該是不必要的。但正如你發現的那樣,有時候正確的方式是行不通的。

[如果有人從蘋果看到這個:報告爲rdar:// 20717042]