显式添加对闭包捕获的引用
这似乎是我能找到的所有 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(因此您不会收到警告),并确保它不会在块结束之前被销毁。