我一直在尝试将单个图片保存到包含标题为“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
}