【问题标题】:Unable to load/retrieve image from Core Data无法从 Core Data 加载/检索图像
【发布时间】:2016-07-17 11:20:44
【问题描述】:

我整天在互联网上搜索解决方案,但没有找到任何地方.. 我正在将图像保存到核心数据中,当使用带有 NSFetchRequest 的 print(results) 进行测试时,建议通过在“调试区域”中显示以下内容来存储在核心数据中...

[<toootesting.Entity: 0x7fb0816a69f0> (entity: Entity; id: 0xd000000000040000 <x-coredata://2D52E511-B03F-4629-ADF1-DEBD80A63EC0/Entity/p1> ; data: { photo = <89504e47 0d0a1a0a 0000000d 49484452 0000021c 000001e4 08020000 00fab561 c2000000 01735247 4200aece 1ce90000 0009>;

使用以下代码保存图像...

 @IBAction func buttonOne(sender: AnyObject) {

    let img = UIImage(named: "Fencing")

    self.imageViewOne.image = img
    let imgData = UIImagePNGRepresentation(img!)

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext

    var newPhotos = NSEntityDescription.insertNewObjectForEntityForName("Entity", inManagedObjectContext: context)

    newPhotos.setValue(imgData, forKey: "photo")

    do {
        try context.save()
        print("image saved")

    } catch {
        print("error - saving NSData Image")
    }
}

但是,当我尝试将保存的 CoreData 图像加载到第二个 imageView 时,获取请求出现错误....“无法将类型 [AnyObject] 的值转换为预期的参数类型 NSData”

代码是……

@IBAction func loadButton(sender: AnyObject) {

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext

    let request = NSFetchRequest(entityName: "Entity")
    request.returnsObjectsAsFaults = false

    do {
        let results = try context.executeFetchRequest(request)

        print(results)

        self.imageViewTwo?.image = UIImage(data: results)

    } catch {
        print("error - Loading!!!")
    }
}

似乎我可以将第一个动作中的 UIImage 转换为 NSData,但在 Fetch 上,无法将 NSData 转换回 UIImage 以便在 viewController 上显示它。

我的问题是,如果我可以轻松地从 UIImage 转换为 NSData,我是否可以以同样的方式反之?是什么阻止代码显示图像?非常感谢编码解决方案。

非常感谢您提前提供的帮助,因为我是这里的新手。

【问题讨论】:

    标签: swift core-data uiimagepngrepresentation


    【解决方案1】:

    获取请求返回一个数组。你必须

    • 提取第一个对象
    • 投到NSData

    因此:

    let results = try context.executeFetchRequest(request) as! [Entity]
    let imageData = results.first!.photo
    

    请注意,在运输代码中,您应该避免强制解包选项。
    以上适用于您已将 NSManagedObject 子类化以描述 Entity 实体。

    【讨论】:

    • 嗨 - 刚刚试过 - 但是'让 imageData = results.first!'导致线程1:EXC_Bad_Instruction(Code+EXC_1386.....)
    • 所以您没有找到任何记录 - 也许它们没有被保存。
    • 当然,您必须强制转换为您的 Entity 并从属性中提取数据。
    • 嗨@Mundi - 记录已保存。调试器在 NSData 中显示 4 个值,但是当达到 imageData 时,会发生 (ErrorType)
    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多