你能在核心数据中保存一组图像吗?
Can you save an array of images in core data?
我知道您可以使用实体的二进制数据 属性 保存一个,但是可以保存多个吗?
你可以用这个节省一个:
UIImageJPEGRepresentation(image: UIImage)
您可以保存它,然后使用
再次将其转换为图像
UIImage(data: ____)
但是我可以将充满图像的数组转换为二进制数据吗?
如果你不能用核心数据,我还有其他方法吗?
顺便说一句,图像数组中全是用户拍摄的保存在设备上的图像..
感谢大家的帮助!
将您的数组转换为 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..
}
Swift 5
有些方法现已弃用。以下代码适用于 Swift 5:
func coreDataObjectFromImages(images: [UIImage]) -> Data? {
let dataArray = NSMutableArray()
for img in images {
if let data = img.pngData() {
dataArray.add(data)
}
}
return try? NSKeyedArchiver.archivedData(withRootObject: dataArray, requiringSecureCoding: true)
}
func imagesFromCoreData(object: Data?) -> [UIImage]? {
var retVal = [UIImage]()
guard let object = object else { return nil }
if let dataArray = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: object) {
for data in dataArray {
if let data = data as? Data, let image = UIImage(data: data) {
retVal.append(image)
}
}
}
return retVal
}
根据 daniel-krom 的回答,我创建了一个 swift 扩展,以便轻松添加到模型对象:
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: [=11=] as! Data)
})
return imgArray
}
else {
print("Unable to convert data to ImageArray")
return nil
}
}
}
我知道您可以使用实体的二进制数据 属性 保存一个,但是可以保存多个吗?
你可以用这个节省一个:
UIImageJPEGRepresentation(image: UIImage)
您可以保存它,然后使用
再次将其转换为图像UIImage(data: ____)
但是我可以将充满图像的数组转换为二进制数据吗?
如果你不能用核心数据,我还有其他方法吗?
顺便说一句,图像数组中全是用户拍摄的保存在设备上的图像..
感谢大家的帮助!
将您的数组转换为 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..
}
Swift 5
有些方法现已弃用。以下代码适用于 Swift 5:
func coreDataObjectFromImages(images: [UIImage]) -> Data? {
let dataArray = NSMutableArray()
for img in images {
if let data = img.pngData() {
dataArray.add(data)
}
}
return try? NSKeyedArchiver.archivedData(withRootObject: dataArray, requiringSecureCoding: true)
}
func imagesFromCoreData(object: Data?) -> [UIImage]? {
var retVal = [UIImage]()
guard let object = object else { return nil }
if let dataArray = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: object) {
for data in dataArray {
if let data = data as? Data, let image = UIImage(data: data) {
retVal.append(image)
}
}
}
return retVal
}
根据 daniel-krom 的回答,我创建了一个 swift 扩展,以便轻松添加到模型对象:
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: [=11=] as! Data)
})
return imgArray
}
else {
print("Unable to convert data to ImageArray")
return nil
}
}
}