[注: タイトルは正確ではないかもしれません。他の言い方がわかりませんでした] 何らかの理由で NSFileHandle の readInBackground が機能しなかったので、Mac OS X の FSEvents API の Cocoa ラッパーである SCEvents に頼りました。すべての SCEvents を処理する「EventListener」という別のクラスがあります。
次のメソッドがあります。
- (void)setupEventlistener
{
SCEvents *events = [SCEvents sharedPathWatcher];
[events setDelegate:self];
NSMutableArray *paths = [NSMutableArray arrayWithObject:NSHomeDirectory()];
NSMutableArray *excludePaths = [NSMutableArray arrayWithObject:[NSHomeDirectory() stringByAppendingString:@"/Downloads"]];
[events setExcludedPaths:excludePaths];
[events startWatchingPaths:paths];
}
- (void)pathWatcher:(SCEvents *)pathWatcher eventOccurred:(SCEvent *)event
{
NSLog(@"%@", event);
}
(これらのメソッドは SCEvents サンプル アプリから直接取得しました。これが機能するようになったら、自分の目的に合わせて変更する予定です)
次に、メイン アプリのデリゲート クラスの applicationDidFinishLaunching メソッドに次のように記述します。
EventListener *events = [[EventListener alloc] init];
[events setupEventlistener];
リスナーを初期化します。これを割り当てて setupEventListener クラスを呼び出すと、すべて正常に動作します。ホーム フォルダー内の変更は、本来あるべき姿でデバッガー コンソールに記録されます。format: と呼ばれる別のメソッドがあります。これは、いくつかのシェル スクリプトを実行します。問題は、フォーマット メソッドが実行されているときに、イベント リスナーが機能しなくなることです。ホーム フォルダへの変更はログに記録されません。この問題は format: メソッドでのみ発生します。他のすべてのメソッドでは、イベント リスナーは正常に機能します。
何が問題なのかわからない。ありがとう