如何知道哪个FileSystemEvent从DispatchSource触发了setEventHandler?

时间:2020-06-22 14:14:20

标签: swift dispatch

当设置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()

1 个答案:

答案 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.
}