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 实例方法,所以fsEventsCallbackself.

您可以使用 中的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 回答