Core Data存储的二进制图片数据转UIImage出现类型报错如何解决?
问题原因
- 你自定义的Core Data实体命名为
Data,与Swift标准库中用于存储二进制数据的Foundation.Data类型重名,编译器混淆了两种类型,你代码中dataItem.asset ?? Data()里的Data()会被默认识别为你的Core Data实体类型,而非二进制数据类型,因此触发类型不匹配报错。 - Core Data中
Binary Data类型的属性默认返回NSObject子类类型,需要显式转换为二进制数据类型才能传入UIImage(data:)方法使用。
解决方案
方案1(推荐):重命名Core Data实体
修改你的Core Data实体名称,避免与系统类型重名,比如改为StoredAsset、UserResource等,修改后同步更新对应的扩展代码、FetchRequest声明中的类型即可从根源解决类型混淆问题。
方案2(临时兼容):显式指定系统二进制类型
如果暂时不需要重命名实体,可以通过添加Foundation.前缀明确指定系统二进制数据类型,同时显式转换asset属性的类型,修改后的渲染代码如下:
var body: some View { LazyVGrid(columns: columns, alignment: .leading){ ForEach(data, id: \.self) { dataItem in GeometryReader { gr in // 显式转换asset为Foundation.Data类型 if let assetData = dataItem.asset as? Foundation.Data, let renderImage = UIImage(data: assetData) { Image(uiImage: renderImage) .resizable() .scaledToFit() } else { // 数据为空或加载失败时的占位图 Image(systemName: "photo") .resizable() .scaledToFit() .foregroundColor(.gray) } } } } }
补充优化建议
如果图片体积较大,不建议直接存储在Core Data中,可将图片写入沙盒目录后仅把路径存在Core Data属性里;如果必须存在Core Data中,记得勾选asset属性的Allows External Storage选项,让Core Data自动将大体积二进制数据存储到外部文件,降低查询性能损耗。
内容的提问来源于stack exchange,提问作者scientiffic
相关产品推荐
相关产品推荐

