我正在 MacRuby 中开发 GUI 应用程序,我需要使用 FSEvents。我正在为不同的目录注册几个流。这些目录中的任何一个更改都会导致运行回调,但有一个大问题:无论哪个目录更改,都会执行最后一次注册的回调。
下面是独立的测试脚本:
framework 'Cocoa'
framework 'CoreServices'
class Monitor
def initialize(dir)
@dir = dir
end
def start(&block)
callback = Proc.new do |stream, context, count, paths, flags, ids|
p @dir
block.call
end
flags = KFSEventStreamCreateFlagUseCFTypes
@stream = FSEventStreamCreate(KCFAllocatorDefault, callback, nil, [@dir], KFSEventStreamEventIdSinceNow, 0.0, flags)
FSEventStreamScheduleWithRunLoop(@stream, CFRunLoopGetCurrent(), KCFRunLoopDefaultMode)
FSEventStreamStart(@stream)
end
end
Monitor.new(Dir.pwd + "/dir1").start { p "dir1" }
Monitor.new(Dir.pwd + "/dir2").start { p "dir2" }
Monitor.new(Dir.pwd + "/dir3").start { p "dir3" }
app = NSApplication.sharedApplication
app.run
当我运行它并开始修改这些目录时:
~/tmp/fsevents $ touch dir1/test
~/tmp/fsevents $ touch dir2/test
~/tmp/fsevents $ touch dir3/test
输出是:
"/Users/janek/tmp/fsevents/dir3"
"dir3"
"/Users/janek/tmp/fsevents/dir3"
"dir3"
"/Users/janek/tmp/fsevents/dir3"
"dir3"
我更希望的是:
"/Users/janek/tmp/fsevents/dir1"
"dir1"
"/Users/janek/tmp/fsevents/dir2"
"dir2"
"/Users/janek/tmp/fsevents/dir3"
"dir3"
也许我可以通过上下文参数提供我需要的数据来解决这个问题(因为检查paths
回调内部会显示实际更改的目录),但是,当前的行为对我来说是完全出乎意料的。
我正在使用 OS X 10.8.2 (12C60) 和 MacRuby 0.12 (ruby 1.9.2) [universal-darwin10.0, x86_64]。