cocoa - 在 XPC 服务中使用 FSEventStream 不起作用

标签 cocoa fsevents xpc

我在 XPC 服务中使用 FSEventStream 时遇到了很大的麻烦(代码如下)。服务启动,创建流,但从未调用回调函数。当我将完全相同的代码复制到主应用程序并运行它时,它工作得很好。它在 XPC 服务中不起作用的可能原因是什么? 我尝试在这两个部分中禁用 AppSandbox,但它没有改变任何东西。非常感谢任何对此的帮助。

代码:

- (void)initEventNotificationStreamForPath:(NSString *)path {

NPDLOG(@"Starting up FS event listener for path: %@", path);

NSArray *pathsToWatch = @[path];

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

NSTimeInterval latency = 1.0;

_eventStream = FSEventStreamCreate(NULL, &eventNotificationCallback, &context, (__bridge CFArrayRef)pathsToWatch, kFSEventStreamEventIdSinceNow,      //[lastEventID unsignedLongLongValue],
        (CFAbsoluteTime)latency, (kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagFileEvents | kFSEventStreamCreateFlagWatchRoot));

if(_eventStream) {

    NPDLOG(@"Scheduling event stream on runloop");

    FSEventStreamScheduleWithRunLoop(_eventStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

    if(!FSEventStreamStart(_eventStream)) {
        NPDLOG(@"Could NOT start event stream listener!!!");
    }
    else {

        CFStringRef description = FSEventStreamCopyDescription(_eventStream);

        NPDLOG(@"Stream description: %@", description);

        CFRelease(description);
    }
}
else {
    NPDLOG(@"Could NOT create event stream listener!!!");
}
}

我的回调函数:

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


//[((__bridge NPScannerServiceAgent *)userData).remoteObject didUpdateFilesAtPaths:(__bridge NSArray *)eventPaths];

printf("CALLBACK CALLED!!!\n");

NSLog(@"GOT FS CHANGE NOTIFICATION FROM %@", (__bridge NPScannerServiceAgent *)userData);

size_t i;

for(i = 0; i < numEvents; i++) {

    NSLog(@"Modified path: %@, flags: %d", [(__bridge NSArray *)eventPaths objectAtIndex: i], eventFlags[i]);
}
}

最佳答案

默认情况下,XPC 服务没有运行循环。尝试使用 FSEventStreamSetDispatchQueue() 而不是 FSEventStreamScheduleWithRunLoop() 在 GCD 队列而不是特定的运行循环上触发回调函数。

关于cocoa - 在 XPC 服务中使用 FSEventStream 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937504/

相关文章:

macos - 使用 XPC 与另一个应用程序通信

ios - NSFetchedResusltsController 宣布了一个举动,但应该是一个更新

cocoa - 更新深色模式: NSColor ignores appearance changes?

objective-c - 设置英语以外语言的字体

macos - OSX 文件系统事件 - 单元测试

objective-c - 如何清除 NSButton 的 keyEquivalent ?

c++ - 在没有 Inotify 的情况下从 Linux 内核读取文件系统事件

node.js - 有什么办法可以通过编辑package.json来摆脱npm可选依赖项警告?

objective-c - XPC 和跨架构 OSX 应用程序