处理包含多个图像的 UIDocument 中的图像加载/存储
Posted
技术标签:
【中文标题】处理包含多个图像的 UIDocument 中的图像加载/存储【英文标题】:Handling image load/store in a UIDocument that contains multiple images 【发布时间】:2018-02-16 18:42:41 【问题描述】:我有一个简单的模型对象Location
,其中包含一些文本项和一个images : [UIImages]?
。 Location
是 Codable
,所以我将文本位存储为 JSON,然后将图像写入相同的 FileWrapper
。
我的问题是如何存储图像文件和 [UIImage] 数组之间的关系。图像必须以相同的顺序返回。有没有办法可以挂接到 Coding 中,以便将数组替换为指向图像的 URL?
或者,我是否应该始终将图像作为单独的文件,例如在缓存目录中,并将 [UIImage] 替换为 [URL]s
【问题讨论】:
UIDocument 不需要任何“编码”,因此不清楚问题所在。您将文档保存到什么格式并从中恢复完全取决于您。如果您不了解如何将图像从文件包装器加载到 UIDocument 中,请查看 Apple 的 sample code。 @matt,这是一个关于如何存储图像和模型对象之间关系的问题。这还不清楚吗?我可以编辑问题。 不,很明显。但这完全取决于你如何去做。您可以制作自己的文件格式。你不能不“正确地”做这件事,因为你要定义什么是“正确地”。同样,我建议您查看我链接到的示例代码。您还没有说明图像如何与文档显示中的文本相关联,所以这一切都只是挥手致意。 @matt,那时还不清楚。这与存储文件无关。它与如何将 [UIImage] 转换为可以存储在 JSON 中的东西有关。我将对其进行编辑以使其更清晰。 你不要把 UIImage 变成可以存储在 JSON 中的东西。这就是您使用文件包装器的原因,这样您就可以将 UIImage 存储在文件包装器中。我不知道你为什么使用 JSON,但如果你要使用它,你使用的 JSON 完全取决于你。看看我指给你的例子!文档知道图像文件的名称。这就是你所需要的。 【参考方案1】:这是一个将一堆图像文件存储在文件包装器中的示例,以及按特定顺序显示它们名称的“索引”(我称之为 list
):
let fm = FileManager.default
let docurl = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
let d = FileWrapper(directoryWithFileWrappers: [:])
let imnames = ["manny.jpg", "moe.jpg", "jack.jpg"]
for imname in imnames
let im = UIImage(named:imname)!
let imfw = FileWrapper(regularFileWithContents: UIImageJPEGRepresentation(im, 1)!)
imfw.preferredFilename = imname
d.addFileWrapper(imfw)
let list = try! JSONEncoder().encode(imnames)
let listfw = FileWrapper(regularFileWithContents: list)
listfw.preferredFilename = "list"
d.addFileWrapper(listfw)
do
try d.write(to: docurl.appendingPathComponent("myFileWrapper"), originalContentsURL: nil)
print("ok")
catch
print(error)
这是一个读取该文件包装器的示例,方法是获取列表,然后按相同顺序按名称获取图像文件:
let fm = FileManager.default
let docurl = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fwurl = docurl.appendingPathComponent("myFileWrapper")
do
let d = try FileWrapper(url: fwurl)
if let list = d.fileWrappers?["list"]?.regularFileContents
let imnames = try! JSONDecoder().decode([String].self, from: list)
for imname in imnames
if let imdata = d.fileWrappers?[imname]?.regularFileContents
print("got image data for", imname)
// in real life, do something with the image here
else
print("no list")
catch
print(error); return
打印出来的:
got image data for manny.jpg
got image data for moe.jpg
got image data for jack.jpg
您在 UIDocument 中要做的只是同样的事情,只是 UIDocument 将为您编写和读取文件包装器。
【讨论】:
以上是关于处理包含多个图像的 UIDocument 中的图像加载/存储的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSFileWrapper 在 UIDocument 中存储 BOOL
UITableView 和 NSFetchedResultsController 的内存泄漏
如何检测 TIFF 图像中的多个条码/二维码并返回它们的值 + 位置?