【问题标题】:How to know which FileSystemEvent triggered the setEventHandler from DispatchSource?如何知道哪个 FileSystemEvent 从 DispatchSource 触发了 setEventHandler?
【发布时间】:2020-06-22 14:14:20
【问题描述】:

当您将 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()

【问题讨论】:

    标签: swift dispatch


    【解决方案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.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多