在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。