2015-08-22 23 views
0

我知道你可以通過使用一個實體的二進制數據屬性來保存一個,但可以保存多個?你可以保存核心數據中的一系列圖像嗎?

您可以使用此保存一個:

UIImageJPEGRepresentation(image: UIImage) 

你可以保存它,然後將其與

UIImage(data: ____) 

再次轉換成圖像,但我可以改變一個數組完整圖像轉換成二進制數據?

如果你不能與核心數據,我能做到的其他任何方式?

BTW,圖像陣列是全保存在設備上的用戶所拍攝的圖像的..

感謝所有的幫手!

+0

已經有一個'swift'標籤,不需要在標題中添加「Swift」。 –

回答

3

您的數組轉換爲NSMutableArray和歸檔作爲NSData

var imgArray = [UIImage](); 

var CDataArray = NSMutableArray(); 

for img in imgArray{ 
    let data : NSData = NSData(data: UIImagePNGRepresentation(img)) 
    CDataArray.addObject(data); 
} 

//convert the Array to NSData 
//you can save this in core data 
var coreDataObject = NSKeyedArchiver.archivedDataWithRootObject(CDataArray); 

從CData的拉扯後,提取數據:

//extract: 
if let mySavedData = NSKeyedUnarchiver.unarchiveObjectWithData(coreDataObject) as? NSArray{ 
    //extract data.. 
} 
+0

如何將數組轉換爲數據? –

+0

@ArbelIsraeli using'NSKeyedArchiver.archivedDataWithRootObject(CDataArray);'看例子 –

+0

是的,但是如果我想以其他方式將數據保存到CD怎麼辦? –

0

基於丹尼爾 - 克羅姆的答案我創建了一個迅速擴展,使它易於添加到模型對象:

let coreDataObject = imgArray.coreDataRepresentation() 

if let retrievedImgArray = coreDataObject?.imageArray() { 
    // use retrievedImgArray 
} 

這裏是擴展名

import UIKit 

typealias ImageArray = [UIImage] 
typealias ImageArrayRepresentation = Data 

extension Array where Element: UIImage { 
    // Given an array of UIImages return a Data representation of the array suitable for storing in core data as binary data that allows external storage 
    func coreDataRepresentation() -> ImageArrayRepresentation? { 
     let CDataArray = NSMutableArray() 

     for img in self { 
      guard let imageRepresentation = UIImagePNGRepresentation(img) else { 
       print("Unable to represent image as PNG") 
       return nil 
      } 
      let data : NSData = NSData(data: imageRepresentation) 
      CDataArray.add(data) 
     } 

     return NSKeyedArchiver.archivedData(withRootObject: CDataArray) 
    } 
} 

extension ImageArrayRepresentation { 
    // Given a Data representation of an array of UIImages return the array 
    func imageArray() -> ImageArray? { 
     if let mySavedData = NSKeyedUnarchiver.unarchiveObject(with: self) as? NSArray { 
      // TODO: Use regular map and return nil if something can't be turned into a UIImage 
      let imgArray = mySavedData.flatMap({ 
       return UIImage(data: $0 as! Data) 
      }) 
      return imgArray 
     } 
     else { 
      print("Unable to convert data to ImageArray") 
      return nil 
     } 
    } 
}