【问题标题】: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。

【问题讨论】:

    标签: ios swift core-data swift2 nsuserdefaults


    【解决方案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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2019-06-13
      相关资源
      最近更新 更多