为什么我不能在swift中的for循环中观看多个文件?

时间:2018-06-15 06:04:05

标签: swift cocoa

我使用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()


    }

1 个答案:

答案 0 :(得分:0)

您每次都会使用新的source重新分配DispatchSourceFileSystemObject属性,但以前分配的来源会被取消分配。我建议在第一种情况下,最后一个fileDescriptor指向永不改变的东西,在第二种情况下,fileDescriptors [1]经常更改。
决定是使var sources = [DispatchSourceFileSystemObject]()而不是单个源属性,并在函数循环中添加源:

let source = DispatchSource.makeFileSystemObjectSource(fileDescriptor: fileDescriptor, eventMask: fsEvent, queue: queue)
sources.append(source)