你能在核心数据中保存一系列图像吗?

时间:2015-08-22 10:26:16

标签: arrays image swift ios8 store

我知道您可以使用实体的二进制数据属性来保存一个但是可以保存多个吗?

您可以使用以下方法保存:

UIImageJPEGRepresentation(image: UIImage)

您可以保存它,然后使用

将其再次转换为图像
UIImage(data: ____)

但是我可以将一个装满图像的数组转换成二进制数据吗?

如果您不能使用核心数据,我可以采用其他任何方式吗?

BTW,图像阵列中充满了用户拍摄的图像保存在设备上..

感谢所有帮助者!

2 个答案:

答案 0 :(得分: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..
}

答案 1 :(得分:0)

根据daniel-krom的回答,我创建了一个快速扩展,以便于添加到模型对象:

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