我在macOS上使用SwiftUI,我正在尝试实现拖拽&只删除文件夹。为此,我使用onDrop
api,如下所示:
view.onDrop(of: [UTType.fileUrl], delegate: self)
func validateDrop(info: DropInfo) -> Bool {
let itemProviders = info.itemProviders(for: [UTType.fileUrl])
for provider in itemProviders {
provider.loadObject(ofClass: URL.self) { url, error in
// Make sure url is a folder
}
}
return ...
}
我使用validateDrop
来确保只有文件夹可以被放入。
这意味着加载每个项目提供程序,并检查url是否为文件夹。
不幸的是,loadObject
api是异步的。这意味着我必须使用类似信号量的东西来返回validateDrop
。
loadObject
的闭包与validateDrop
在同一个线程上执行,这可能会导致死锁。在loadItem
的文档中(非常相似),它声明
block可以在后台线程中执行
关键字may(所以它可以在同一个线程上执行)。
有没有更好的不需要阻塞的解决方案?
你有DispatchQueue.main.async
吗?这就是我在我的代码中使用的,我和你有相同的流程。
@State private var isTargeted: Bool = false // Not used
.onDrop(of: [.fileURL], isTargeted: $isTargeted, perform: { providers in
dropFile(providers: providers, target: document.id)
return true
})
private func dropFile(providers: [NSItemProvider], target: String) {
for item in providers {
_ = item.loadObject(ofClass: URL.self) { url, _ in
if let url = url {
if url.hasDirectoryPath {
DispatchQueue.main.async {
store.moveFile(id: url.path, newNeigbour: target)
}
}
}
}
}
}