【问题标题】:No events received when using DispatchSource.makeFileSystemObjectSource() to monitor changes to file使用 DispatchSource.makeFileSystemObjectSource() 监视文件更改时未收到任何事件
【发布时间】:2022-11-23 07:34:15
【问题描述】:

我找到了this article about watching for changes,并尝试正确地跟进。我的调度源已创建,但我从未收到任何事件。

为了确保我得到任何东西,我确保设置了eventMask = .all

override func viewDidAppear() {
    super.viewDidAppear()

    Task {
        self.configurl = await self.openfile(forkey: self.keybookmarkconfig)
                    
        if let url = self.configurl {
    
            print("creating filehandle for \(url.absoluteString)")
            self.configfilehandle = try FileHandle(forReadingFrom: url)
    
            print("creating dispatch source to watch \(url.absoluteString)")
            self.source = DispatchSource.makeFileSystemObjectSource(
                fileDescriptor: self.configfilehandle.fileDescriptor,
                eventMask: .all,
                queue: DispatchQueue.main
            )
    
            print("setting event handler for dispatch source")
            self.source.setEventHandler {
                print("config file changed")
            }
    
            print("done with watcher setup")
    
        }

        
    }
    
}

我尝试以多种方式更新文件。我在 BBEdit 和 TextEdit 中编辑/保存了它,但是由于关于这些类型的编辑器如何删除/重新创建文件的警告,我也尝试使用 vim 从命令行编辑它。我什至做过echo "test" >> myfile.txt。但是我的事件处理程序中从未收到任何事件。我在每次测试之间重新启动了我的应用程序,所以我有一个新的文件句柄。

知道为什么我没有收到任何事件回调吗?

【问题讨论】:

    标签: swift filesystems


    【解决方案1】:

    创建调度源后,您必须调用self.source.activate() 以便调度和启动源。否则它只是坐在那里。

    来自documentation

    创建调度源后,使用 DispatchSourceProtocol 协议的方法来安装您需要的事件处理程序。返回的 dispatch source 最初处于 inactive 状态。当您准备好开始处理事件时,调用它的 activate() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多