私は 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] を使用しています。