1

タイマーの実行を避けたいのでFSEventStreamCreate、データベースファイルが変更されたときにアプリケーションにアドバイスするためにを使用したいと思います。チェックするパスの配列に含めることで、アプリケーションで必要な結果が得られますNSHomeDirectory()が、これはホームディレクトリが非常にビジーであるためです。私が除外した場合、NSHomeDirectory()または何らかの理由でマシンが私のようにビジーではなかった場合、アプリケーションはデータベースファイルへの変更を十分な頻度でトラップしませんでした。

次のコードは、デバッグセッションを開始するたびに1回だけ機能します。

-(void) initializeEventStream
{

    NSString *databaseDirectoryPath = @"/Library/FileMaker Server/Data/Databases/development";
    NSString *homeDirectoryPath = NSHomeDirectory() ;

    NSArray *pathsToWatch = [NSArray arrayWithObjects:databaseDirectoryPath,  homeDirectoryPath, nil];
    void *appPointer = (void *)self;
    FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
    NSTimeInterval latency = 3.0;

    self.fileSystemEventStreamRef = FSEventStreamCreate(NULL,
                                 &fsevents_callback,
                                 &context,
                                 (CFArrayRef) pathsToWatch,
                                 [self.lastEventIDNumber unsignedLongLongValue],
                                 (CFAbsoluteTime) latency,
                                 kFSEventStreamCreateFlagUseCFTypes
                                 );

    FSEventStreamScheduleWithRunLoop(self.fileSystemEventStreamRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
    FSEventStreamStart(self.fileSystemEventStreamRef);
}

FSEventStreamCreateレスポンシブにする方法に関するアイデア

NSString *databaseDirectoryPath = @"/Library/FileMaker Server/Data/Databases/development";

4

1 に答える 1

1

次のコードを試してください。

-(void) initializeEventStream
{

    NSString *databaseDirectoryPath = @"/Library/FileMaker\ Server/Data/Databases/development";
    NSString *homeDirectoryPath = NSHomeDirectory() ;

    NSArray *pathsToWatch = [NSArray arrayWithObjects:databaseDirectoryPath,  homeDirectoryPath, nil];
    void *appPointer = (void *)self;
    FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
    NSTimeInterval latency = 1.0;

    self.fileSystemEventStreamRef = FSEventStreamCreate(NULL,
                             &fsevents_callback,
                             &context,
                             (CFArrayRef) pathsToWatch,
                             kFSEventStreamEventIdSinceNow,
                             (CFAbsoluteTime) latency,
                             kFSEventStreamCreateFlagWatchRoot
                             );

    FSEventStreamScheduleWithRunLoop(self.fileSystemEventStreamRef, CFRunLoopGetCurrent(),     kCFRunLoopDefaultMode);
    FSEventStreamStart(self.fileSystemEventStreamRef);
}
于 2013-09-11T16:36:43.130 に答える