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

标签 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()

最佳答案

看起来 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.
}

关于swift - 如何从DispatchSource中知道哪个FileSystemEvent触发了setEventHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62516458/

相关文章:

ios - 当 iOS 应用进入后台时,我们如何发送 Google Analytics 事件?

ios - 这些快速崩溃意味着什么?

swift - 如何更新 NSView 图层位置和 anchor 以与鼠标事件的 NSView 框架同时进行转换

json - 如何使用 ObjectMapper 转换带有动态键的 JSON?

julia - 方法将不匹配嵌套类型限制

java - 多个参数的多重分派(dispatch)

arrays - 在 Swift 中使用过滤器时如何处理元素位置

swift - 如何使用来自 childByAutoID 的数据填充 tableView

ios - 清除方法中的静态变量

reactjs - 具有调度函数的 useSelector 和 UseEffect 由于不更新状态而创建循环