处理OSX中的文件系统事件

时间:2013-01-07 05:04:42

标签: objective-c cocoa events

所以我使用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");
}

1 个答案:

答案 0 :(得分: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
                                 );
}