当设置eventMask以捕获所有FileSystemEvents时,如下面的代码所示。您如何检索触发该方法的事件?
self.source = DispatchSource.makeFileSystemObjectSource(fileDescriptor: descriptor, eventMask: .all, queue: DispatchQueue.main)
guard let source = self.source else {
return
}
source.setCancelHandler {
if let descriptor = self.descriptor {
close(descriptor)
self.descriptor = nil
}
}
source.setEventHandler { [weak self] in
// How to know which FileSystemEvent triggered this method?
}
source.resume()
答案 0 :(得分:1)
似乎source保留了上一个文件系统事件。
source.setEventHandler { [weak self] in
print(source.data)
}
我还创建了一个小助手:
extension DispatchSourceFileSystemObject {
var dataStrings: [String] {
var s = [String]()
if data.contains(.all) { s.append("all") }
if data.contains(.attrib) { s.append("attrib") }
if data.contains(.delete) { s.append("delete") }
if data.contains(.extend) { s.append("extend") }
if data.contains(.funlock) { s.append("funlock") }
if data.contains(.link) { s.append("link") }
if data.contains(.rename) { s.append("rename") }
if data.contains(.revoke) { s.append("revoke") }
if data.contains(.write) { s.append("write") }
return s
}
}
现在,如果您将代码更改为:
source.setEventHandler { [weak self] in
print(source.dataStrings) // Will output all flags in readable format.
}