Swift 工具类:处理临时文件
作者:Ole Begemann,原文链接,原文日期:2018-03-22
译者:小袋子;校对:numbbbbb,Yousanflics;定稿:Forelax
我经常需要在某些操作中创建临时文件,每次都很繁琐:必须有合适的临时目录,确保文件名是唯一的,最后还不能忘记在操作完成之后删除文件。
实际上,“创建”是一个错误的说法,因为创建工作通常是由我使用的 API 负责的 — 而我只是提供了一个指向目的位置的 URL。举个例子,假设你的应用提供了一个分享 PDF 文件的功能。你需要创建一个 UIGraphicsPDFRenderer
对象来生成 PDF,然后调用 writePDF
方法并传入临时文件的 URL 生成 PDF 文件,最后在 iOS 分享列表(share sheet)中分享它。
为了使这个操作更加简便,我最近写了一个简单的 Swift 工具类。你可以这样使用:
1、选择一个文件名来初始化 TemporaryFile
:let tmp = try TemporaryFile(creatingTempDirectoryForFilename: "report.pdf")
这样就新建了一个唯一的临时目录。正如我前面提到的,这是个空目录,TemporaryFile
并不会创建任何文件。更确切地说,它只是提供了一个可以安全创建很多文件的目录,并且不用担心命名冲突。
2、TemporaryFile
有两个属性,directoryURL
是创建的临时目录 URL。fileURL
是目录中的文件 URL,即初始化时指定的文件名:
print(tmp.directoryURL.path) |
再次强调一下,该 URL 对应的文件暂时还不存在——你必须自己创建文件,通常来说可以把 URL 传入其他 API 来生成文件:
let renderer = UIGraphicsPDFRenderer(...) |
你可以在目录中创建不同名字的文件,但是 TemporaryFile
类型目前只能用来存储单一的文件 URL。如果能够支持多文件 URL 的存储,那就会更好用了。
3、创建文件后,TemporaryFile
的值被应用中使用该文件的对象所持有(例如,创建文件函数的调用者)。当该对象完成后并且不再需要该文件时,可以调用DeleTeDirectory
方法删除临时目录,包括其中的所有文件:
// 例如将 temp 文件传给 UIActivityController 用以分享 |
我曾考虑到让这个步骤自动化 — 你可以创建 TemporaryFile
类,然后在 deinitializer
中调用 deleteDirectory
。最后我放弃了,因为这种行为可能让类型的使用者感到困惑。如果能够添加一个初始化标志位来配置删除行为就好了。
代码
以下是完整代码 (Swift 4.0):
import Foundation |
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。