我一直在尝试将单个图片保存到包含 Headers 为“prof”的单个属性并配置为二进制数据类型的实体 .

我通过箍从UIImagePickerViewController中选择一张图片,然后我调用我的方法来处理以所需的NSData格式保存Core Data中的图片 .

我的问题源于加载图片,在我的loadImage方法中,图像的实体不是零,这意味着它确实存在 . 但是,当我尝试将获取的NSData解析为UIImage格式以重新创建图片然后能够使用它时,我得到nil . 现在我正在使用Swift 3和Xcode 8,到目前为止所有的故障排除问题都有将NSData转换为UImage的解决方案,如下所示:

let image : UIImage = UIImage(data: imageData)

但是,当我这样做时,xcode给了我一个编译错误,而是迫使我把它转换为:

let image : UIImage = UIImage(data: (imageData as Data?)!)

这就是我得到的空气在空中投掷我的流量......我尝试以多种方式保存数据,但仍然没有 .

如果有人可以通过我的以下方法,看看我是否可能在保存部分做错了什么,或者在fetch方法上形成NSData ......任何事都会有所帮助 .

My configuration

  • prof属性将“Allow external storage”设置为true

-my持久性存储在应用程序安装时播种为空白,这意味着在第一次启动应用程序时已经设置了所有需要的属性,但显然设置为nil,直到我的各种数据流更改或修改为止 .

  • 我的数据模型中没有其他图片实体,这是唯一的一个 .
func saveProfilePicture(_ pic: UIImage){

    let picData = UIImagePNGRepresentation(pic)

    let request: NSFetchRequest<UsePics> = UsePics.fetchRequest()


    do {
        let records = try coreDataManager.managedObjectContext.fetch(request) as [UsePics]
        let first = (records.first)
        first?.setValue(picData, forKey: "prof")

        try context.save()
    } catch let err {
        print(err)

    }
}

func getProfilePicture() -> UIImage? {

    let request: NSFetchRequest<UsePics> = UsePics.fetchRequest()

    var image : UIImage?

    do {
        let records = try coreDataManager.managedObjectContext.fetch(request) as [UsePics]
        let first = (records.first?.prof) as NSData

        if let parsedImage : UIImage = UIImage(data: (first as Data?)!) as? UIImage {

            image = parsedImage
        }

    } catch let err {
        print(err)

    }
    return image
}

EDIT

通过注意到在Swift 3中,UIImage类遵循Transformable协议,发现了解决方案 . 将我的属性类型从二进制数据交换到Transformable实际上可以将UIImage作为UIImage直接保存到Core Data而不将其解析为另一种数据类型 .

func saveProfilePicture(_ image: UIImage){

    let request: NSFetchRequest<UsePics> = UsePics.fetchRequest()

    do {
        let records = try coreDataManager.managedObjectContext.fetch(request) as [UsePics]
        let first = (records.first)

        first?.prof = image

        print(first)
        coreDataManager.saveData()
    } catch let err {
        print(err)

    }
}
func loadProfilePicture() -> UIImage? {

    var image : UIImage?


    let request: NSFetchRequest<UsePics> = UsePics.fetchRequest()

    do {
        let records = try coreDataManager.managedObjectContext.fetch(request) as [UsePics]
        let first = records.first

        if let img = first?.prof {

            image = img as? UIImage
        } else {
            print("no image")
        }


    } catch let err {
        print(err)

    }

    return image
}