2016-06-06 57 views
0

我在覈心數據中有一個圖像。它保存爲NSData的,我有一個計算的屬性基於Core Data屬性imageData來獲取和設置圖像:核心數據和UIImage的性能

var image: UIImage? { 
    get { 
     if let imageData = imageData { 
      return UIImage(data: imageData) 
     } else { 
      return nil 
     } 
    } 

    set { 
     if let image = image { 
      imageData = UIImagePNGRepresentation(image) 
     } else { 
      imageData = nil 
     } 
    } 
} 

但是,我相信,這個代碼將每次UIImageNSData之間的轉換該圖像被提取,這可能是很常見的,因爲這個數據被用來填充UITableViewCell。這是真的,還是Xcode足夠聰明,以某種方式緩存計算的屬性?此外,這是從核心數據獲取圖像的推薦方式,或推薦給一次獲取它並將其保存到一個新的屬性這樣的(不確定的,如果這個代碼是正確的):

lazy var image: UIImage? = { 
     if let imageData = imageData { 
      return UIImage(data: imageData) 
     } else { 
      return nil 
     } 
}() 

的缺點我看到的最後一個是,如果不更新image,將有可能更改imageData。我也不確定我是否可以在後一版本中使用didSet來更新核心數據。

+0

[看看這個git回購](https://github.com/romainmenke/SimpleCam)它從一個表中顯示來自CoreData的圖像。它是異步的,並不會獲取單元格中的圖像,而是以單獨的方法獲取圖像。 [如何:圖像&coredata](http://stackoverflow.com/questions/27995955/saving-picked-image-to-coredata/27996685#27996685) –

回答

1

假設imageData是實體描述的屬性,

  • 管理對象的上下文將緩存imageData
  • image不會被緩存,每次都會重新計算。

如果您打算將圖像存儲在覈心數據中,正確的方法比您做得更簡單。 UIImage符合NSCoding,這意味着您可以使用核心數據「可轉換」類型創建image屬性。核心數據然後將自動調用NSCoding方法轉換爲/從UIImage,你不需要你的問題中的任何代碼。你只是讀/寫你的UIImage

如果您打算將圖像存儲在覈心數據中,請使用任意方案,確保圖像不太大。核心數據可以處理它們,但是你可能會發現圖像數據在你不期望的時候被加載。例如,如果您只使用託管對象的其他非圖像屬性,但無論如何都會加載圖像數據。

+0

另外,在模型中用「外部存儲」標記圖像屬性編輯器如果圖像很大。 – Mundi

+0

@Mundi不幸的是(仍然!)不是可變形屬性的選項。 –

+0

對,感謝您指出了這一點!我想另一個值得指出的解決方案是使用'NSData'作爲屬性類型,選擇「外部存儲」並編寫一個方便的方法來檢索圖像。這與OP的解決方案非常接近。 – Mundi