【问题标题】:Temporary files are being removed during execution on iOS在 iOS 上执行期间正在删除临时文件
【发布时间】:2020-10-27 04:21:06
【问题描述】:

令人惊讶的是,经过一段时间的调试,我发现我的应用程序在 1 分钟左右后从 tmp 目录中清除文件,而没有任何其他用户操作,即使应用程序在前台运行也是如此。

根据文档,临时目录应该在应用执行期间保留文件,并且仅在之后或最多在启动时将其删除。

我不想在这里移动/复制到缓存目录作为解决方法,我更惊讶为什么会发生这种情况。如果这有帮助,我会从“文件”应用中挑选(使用 UIDocumentPickerViewController)。

为了让它变得更好,有时有些文件会在那里保留很长时间,即使它们比其他文件更旧,在挑选后立即被删除。这可能导致访问不正确,因为您的用户选择了一个文件,在应用程序仍在运行时去喝杯咖啡,然后按下按钮将其上传到某个地方或其他任何地方,然后文件就消失了。

我每次都可以用一个简单的应用程序复制它。

【问题讨论】:

  • 只是检查显而易见的 - 您使用的是正确的 tmp 目录,而不是自己删除这些文件,例如当某个变量超出范围时?也许发布一些代码......如果您可以轻松更改代码中的目录,一个简单的测试将是使用“普通”目录。
  • 不,基本上我只是使用 UIDocumentPickerController 然后在 didPick 上我返回它的路径。 (这是用作插件的 pod 代码)。文件消失大约需要一分钟左右。如果您在选择后打印tmp 文件夹中的文件,它就在那里。然后,您等待 1 分钟,再次打印,但不存在。这是奇怪的部分。
  • 当你这样做时会发生奇怪的事情!当您选择一个文档时,它通常会被复制,并且路径会发生奇怪的变化(相对于正常人的预期而言,这很奇怪,但我离题了)。当您选择文档时,它会被复制,并且通常UIDocumentwriteContentsToUrl ... originalUrl... 会收到消息。这会创建一个副本,然后删除原始文件,以便文件可以以一种奇怪的方式更改。 Apple 这样做是为了让您轻松倒带,但基本上所有内容都会在您保存时重复。我怀疑这就是为什么新的 Apple 文件系统如此擅长复制文件的原因。
  • 注意 - 我怀疑这是你的麻烦。该路径在复制过程中可能会发生变化,并且文档可能会在其他地方打开副本,因此它仍然存在,只是不在您期望的原始位置。
  • 更奇怪的是,它不应该在应用程序仍在运行时删除文件,但它确实可以。通过阅读at the docs,它表示检索当前用户的路径。这很容易引起误解,因为它暗示这个 tmp 目录由所有应用程序共享,而实际上,每个应用程序似乎都有自己的。

标签: ios objective-c caching directory


【解决方案1】:

在处理了一些临时文件之后,我不认为这是一个错误,它是临时文件在一段时间未打开时被删除的功能。我相信您可以通过区分普通文件和临时文件来更直接地管理它。根据更详细的文章here,您可以使用ManagedURL 协议来解决您的问题:

public protocol ManagedURL {
    var contentURL: URL { get }
    func keepAlive()
}

public extension ManagedURL {
    public func keepAlive() { }
}

extension URL: ManagedURL {
    public var contentURL: URL { return self }
}

让后台操作保持活跃:

URLSession.shared.uploadTask(with: request, fromFile: fileToUpload.contentURL) { _, _, _ in
    temporaryFile.keepAlive()
}

【讨论】:

  • 根据问题,您是如何在普通文件中使用它的?
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多