我使用DispatchSource API来查看我的macOS应用程序中文件系统的更改。当我一个接一个地做它时,它起作用,但是当我在for循环中这样做时它不起作用。为什么会这样? Aren他们一样吗?
这不起作用,文件描述符是正确的,但永远不会调用setEventHandler
func watch(onFsChange: @escaping () -> Void) {
for fileDescriptor in self.fileDescriptors {
source = DispatchSource.makeFileSystemObjectSource(fileDescriptor: fileDescriptor, eventMask: fsEvent, queue: queue)
source?.setEventHandler {
FSWatcher.updateStatus()
onFsChange()
}
source?.setCancelHandler {
close(fileDescriptor)
}
source?.resume()
}
}
这是有效的,当路径发生任何变化时会调用setEventHandler
func watch(onFsChange: @escaping () -> Void) {
source = DispatchSource.makeFileSystemObjectSource(fileDescriptor: self.fileDescriptors[0], eventMask: fsEvent, queue: queue)
source?.setEventHandler {
FSWatcher.updateStatus()
onFsChange()
}
source?.setCancelHandler {
close(self.fileDescriptors[0])
}
source?.resume()
source = DispatchSource.makeFileSystemObjectSource(fileDescriptor: self.fileDescriptors[1], eventMask: fsEvent, queue: queue)
source?.setEventHandler {
FSWatcher.updateStatus()
onFsChange()
}
source?.setCancelHandler {
close(self.fileDescriptors[1])
}
source?.resume()
}
答案 0 :(得分:0)
您每次都会使用新的source
重新分配DispatchSourceFileSystemObject
属性,但以前分配的来源会被取消分配。我建议在第一种情况下,最后一个fileDescriptor指向永不改变的东西,在第二种情况下,fileDescriptors [1]经常更改。
决定是使var sources = [DispatchSourceFileSystemObject]()
而不是单个源属性,并在函数循环中添加源:
let source = DispatchSource.makeFileSystemObjectSource(fileDescriptor: fileDescriptor, eventMask: fsEvent, queue: queue)
sources.append(source)