0

したがって、EventStreamを使用してフォルダの変更を監視しています。これですべて正常に動作し、フォルダー内のファイルを変更するとログコールバックが表示されますが、folderWatchを呼び出せないようで、「宣言されていない識別子'self'の使用」というエラーが表示されます。この関数は、fsEventsCallbackだけでなく、他の場所でも使用できます。どんな助けでもいただければ幸いです!

   void fsEventsCallback(ConstFSEventStreamRef streamRef,
                      void *clientCallBackInfo,
                      size_t numEvents,
                      void *eventPaths,
                      const FSEventStreamEventFlags eventFlags[],
                      const FSEventStreamEventId eventIds[]){


    [self folderWatch];

    NSLog(@"2");
}
4

1 に答える 1

3

その理由は、これfsEventsCallbackはC関数であり、Objective-Cインスタンスメソッドではないため、fsEventsCallbackについては何も知りませんself

infoのフィールドを使用して、コールバック関数FSEventStreamContextに渡すことができます。self次の例では、クラスがと呼ばれることを前提としていますWatcher

(ARCを使用しない場合は、すべての__bridgeキャストを省略できます。)

- (void)folderWatch
{

}

void fsEventsCallback(ConstFSEventStreamRef streamRef,
                      void *info,
                      size_t numEvents,
                      void *eventPaths,
                      const FSEventStreamEventFlags eventFlags[],
                      const FSEventStreamEventId eventIds[])
{
    Watcher *watcher = (__bridge Watcher *)info;
    [watcher folderWatch];
}

- (void)startWatching
{
    FSEventStreamContext context;
    context.info = (__bridge void *)(self);
    context.version = 0;
    context.retain = NULL;
    context.release = NULL;
    context.copyDescription = NULL;

    NSArray *pathsToWatch = @[@"/path/to/watch"];

    self.eventStream = FSEventStreamCreate(NULL,
                                 &fsEventsCallback,
                                 &context,
                                 (__bridge CFArrayRef)(pathsToWatch),
                                 kFSEventStreamEventIdSinceNow,
                                 1.0,
                                 kFSEventStreamCreateFlagFileEvents
                                 );
}
于 2013-01-07T06:07:51.387 に答える