保存和读取图像数组
Posted
技术标签:
【中文标题】保存和读取图像数组【英文标题】:Saving and Reading Image Array 【发布时间】:2016-07-01 21:02:18 【问题描述】:我想将我的图像数组“DtaAryVar”保存在“NSUserDefaults”或“文档目录”或“核心数据”中。谁能一步一步告诉我什么是最好和最简单的方法来存储它以及“UIImage”数组(包含20个图像)到“NSData”转换。我的“DtaAryVar”包含 20 张图像。我尝试了以下从堆栈溢出中找到但出现错误的方法。请帮帮我。
var DtaAryVar: [NSData]()
convert array of NSData to Data and store
let DtaZipVar = NSKeyedArchiver.archivedDataWithRootObject(DtaAryVar)
let DftSdbVal = NSUserDefaults.standardUserDefaults()
DftSdbVal.setObject(DtaZipVar, forKey: "ImageKey")
get back data by
var DtaZipVar = DftSdbVal.valueForKey("ImageKey")
var DtaAryVar = NSKeyedUnarchiver.unarchiveObjectWithData(DtaZipVar) as! [NSData]
let ImjAryVar = [UIImage]()
for DtaIdxVar in DtaAryVar
ImjAryVar.append(UIImage(data : DtaIdxVar))
错误 无法转换“AnyObject”类型的值?到预期的参数类型'NSData。
【问题讨论】:
【参考方案1】:|=> U 只能在 userDefautls 或 coreData 中存储 NSData 而不是 [NSData]
|=> 如果你存储在核心数据中,将属性类型指定为二进制
|*|将原始数据中的行添加到 CoreData:
let NewRowDtaVar = NSEntityDescription.insertNewObjectForEntityForName("NamTbl", inManagedObjectContext: ContxtVar)
NewRowDtaVar.setValue(ImgDtaVar, forKey: "NamKol")
AppDgtVar.saveContext()
|*|从 CoreData 获取行数据:
let GetDtaAryReqVar = NSFetchRequest(entityName: "NamTbl")
GetDtaAryReqVar.returnsObjectsAsFaults = false
GetDtaAryReqVar.predicate = NSPredicate(format: "NamKol = TstTxt")
let ImgDtaVar = NSData()
do
let ReqResAryVar: Array = try ContxtVar.executeFetchRequest(GetDtaAryReqVar)
if(ReqResAryVar.count > 0)
for ReqResVar in ReqResAryVar
ImgDtaVar = ReqResVar.valueForKey("NamKol") as! NSData!
catch let ErrVar as NSError
print("Fetch failed: \(ErrVar.localizedDescription)")
在您的任何 viewController 类之外添加以下扩展函数并相应地尝试
extension UIImage
//|*| Convert Image NSData Arry to UIImage Array
func CnvDtaAryTooImjAryFnc(ImjDtaAryPsgVar: [NSData])-> [UIImage]
var ImjAryVar = [UIImage]()
for DtaIdxVar in ImjDtaAryPsgVar
ImjAryVar.append(UIImage(data : DtaIdxVar)!)
return ImjAryVar
//|*| Convert Image NSData to UIImage Array
func CnvDtaTooImjAryFnc(ImjDtaPsgVar: NSData)-> [UIImage]
let ImjAryVar = NSKeyedUnarchiver.unarchiveObjectWithData(ImjDtaPsgVar) as! [NSData]
return CnvDtaAryTooImjAryFnc(ImjAryVar)
//|*| Convert UIImage Array to Image NSData Arry
func CnvImjAryTooDtaAryFnc(ImjDtaPsgVar: [UIImage], ImjTyp ImjTypPsgVar: String?="Jpg")-> [NSData]
var ImjDtaAryVar = [NSData]()
for DtaIdxVar in ImjDtaPsgVar
if(ImjTypPsgVar == "Png")
if let GetImjDtaVar = UIImagePNGRepresentation(DtaIdxVar)
ImjDtaAryVar.append(GetImjDtaVar)
else
if let GetImjDtaVar = UIImageJPEGRepresentation(DtaIdxVar, 1)
ImjDtaAryVar.append(GetImjDtaVar)
return ImjDtaAryVar
//|*| Convert UIImage Array to Image NSData
func CnvImjAryTooDtaFnc(ImjDtaPsgVar: [UIImage], ImjTyp ImjTypPsgVar: String?="Jpg")-> NSData
let ImjDtaAryVar = CnvImjAryTooDtaAryFnc(ImjDtaPsgVar, ImjTyp : ImjTypPsgVar)
return NSKeyedArchiver.archivedDataWithRootObject(ImjDtaAryVar)
【讨论】:
以上是关于保存和读取图像数组的主要内容,如果未能解决你的问题,请参考以下文章