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