在Swift中管理临时文件

引用计数非常适合将未使用的对象带出内存。 这同样适用于我们分配的临时文件。

假设您正在构建一个视频共享应用程序,这是每次用户决定从该应用程序上传一些内容时必须执行的操作:

  • 拍摄电影并存储到临时文件中。
  • 向用户展示过滤器/裁剪/任何编辑用户界面。
  • 将最终视频渲染到另一个临时文件,现在可以安全地删除第一个文件。
  • 将视频上传到云中,完成后删除第二个文件。

手动处理这些文件会增加额外的复杂性,并且可以很容易地进行监督,从而由于丢失数据而导致过多的存储使用。 当我的宠物项目突然接管了我所有的存储库时,我自己面对了这个问题😂

引用计数在这里很容易解决:我们可以创建包含常规URL TemporaryFileURL类,并在其deinit方法中执行清除。 现在,临时文件在从应用程序中取消引用时将自动删除。

请注意,我在这里使用了很少使用的带有赋值语法的捕获来传递contentURL进行延迟的文件清理:我们最好不要在释放过程中捕获self ,因此我们只复制基础文件URL并让self正确地释放。

现在,您可能希望统一处理文件的所有代码,无论它们是正常的还是临时的。 这就是ManagedURL协议的代表。 我们可以使URL struct和/或NSURL类符合协议,并在各处传递ManagedURL引用。

我还添加了一个no-op keepAlive函数,其唯一目的是允许通过用作完成处理程序的各种闭包轻松捕获对象。 这样我们可以在执行后台操作时保留文件,如下所示:

正如詹姆斯·理查德(James Richard)在Twitter上提醒的那样,这种技术称为“资源获取即初始化”或RAII,并且已经在C ++中使用很久了。 这个技巧对管理任何外部资源的生命周期都非常有用,但是由于析构函数在ARC,GC,延迟,try / finally和其他方法的现代世界中并不常见,因此常常被忽略。


感谢您的宝贵时间,并希望本文对您有所帮助。 如果您觉得本文有用,请不要忘记to。