明确添加对闭包捕获的引用

  • 本文关键字:引用 闭包 添加 swift
  • 更新时间 :
  • 英文 :


这似乎是我能找到的所有Swift闭包问题的相反问题!

我正在使用NSFilePromiseReceiver将文件复制到应用程序的存储中。我想用一个临时目录来做这件事,我喜欢/经常使用Ole Begemann的临时目录模式:https://oleb.net/blog/2018/03/temp-file-helper/

所以,我会这样使用:

guard let tempDirectory = TemporaryDirectory() else { return }

promise.receivePromisedFiles(atDestination: temporaryDirectory.url, options: [:],
operationQueue: OperationQueue()) { fileURL, error in
...
}

在这里,我需要临时目录对象在闭包的生命周期中生存,但闭包并不明确需要它。

有没有办法强制闭包捕获目录?

如果我将[tempDirectory]添加为捕获列表,我会收到一个编译器警告,说它没有被使用,并且测试显示它只是被捕获而不是。在闭包中对tempDirectory调用一些不必要的操作是有效的,但这太可怕了。

有什么想法吗?

只是捕捉matt在评论中所说的话(以防他没有写更长的答案(。您想要withExtendedLifetime:

...       
operationQueue: OperationQueue()) { [tempDirectory] fileURL, error in
withExtendedLifetime(tempDirectory) { ... }
}

这创建了一个";用法";的tempDirectory(这样您就不会收到警告(,并确保它在块结束之前不会被销毁。

最新更新