将UIImage保存到核心数据中使用ImagePickerView时始终返回Nil - Swift 3

时间:2016-11-21 18:15:54

标签: swift core-data uiimage swift3

我一直在尝试将单个图片保存到包含标题为“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 ......任何事情都会有所帮助。

我的配置

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

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

- 我的数据模型中没有其他图片实体,这是唯一的图片实体。

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
}

修改

通过注意到在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
}

0 个答案:

没有答案