objective-c - 处理 OSX 中的文件系统事件

标签 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");
}

最佳答案

原因是 fsEventsCallback 是一个 C 函数,而不是 Objective-C 实例方法,因此 fsEventsCallback 不知道任何关于 self 的信息.

您可以使用 FSEventStreamContext 中的 info 字段将 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
                                 );
}

关于objective-c - 处理 OSX 中的文件系统事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14190166/

相关文章:

ios - NSMutableArray removeObject 崩溃

javascript - React 数据预览中显示 PhoneInput 值

cocoa - 使用自动布局删除并重新添加 subview

objective-c - AF网络进度方法

objective-c - 将 webview 的内容设置为 html 字符串( cocoa )

events - Console.ReadLine() 传递给 C# 事件

JavaScript:鼠标滚轮事件在文本框上方时不会触发

ios - 根据设备屏幕 iPhone 4/5 和 iPhone 6/Plus 调整 UILabel 的字体大小

objective-c - 如何在 XCode 中设置反向关系

ios - 如何在不自定义的情况下在一个单元格中有多行?