显式添加对闭包捕获的引用

这似乎是我能找到的所有 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在闭包中调用一些不必要的操作是可行的,但这太可怕了。

有任何想法吗?

回答

只是捕捉马特在评论中所说的话(以防他不在写更长的答案)。你想要withExtendedLifetime

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

这会创建一个“使用” tempDirectory(因此您不会收到警告),并确保它不会在块结束之前被销毁。


以上是显式添加对闭包捕获的引用的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>