Cocoa 在XPC服务中使用FSEventStream不起作用
我在XPC服务中使用FSEventStream时遇到了很大的问题(代码如下)。服务启动,创建流,但从不调用回调函数。当我将完全相同的代码复制到我的主应用程序并运行它时,它工作得很好。它在XPC服务中不起作用的原因可能是什么? 我尝试在这两个部分禁用AppSandbox,但它没有改变任何东西。非常感谢您在这方面的任何帮助 代码: 我的回调函数:Cocoa 在XPC服务中使用FSEventStream不起作用,cocoa,fsevents,xpc,Cocoa,Fsevents,Xpc,我在XPC服务中使用FSEventStream时遇到了很大的问题(代码如下)。服务启动,创建流,但从不调用回调函数。当我将完全相同的代码复制到我的主应用程序并运行它时,它工作得很好。它在XPC服务中不起作用的原因可能是什么? 我尝试在这两个部分禁用AppSandbox,但它没有改变任何东西。非常感谢您在这方面的任何帮助 代码: 我的回调函数: void eventNotificationCallback(ConstFSEventStreamRef streamRef, void *userDat
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]);
}
}
void eventNotificationCallback(ConstFSEventStreamRef streamRef,void*userData,size\u t numEvents,void*eventpath,const fseventstreamventflags eventFlags[],const fseventstreamventid eventid[]){
//[((u桥NPScannerServiceAgent*)用户数据。远程对象didUpdateFileSatPath:(u桥NSArray*)事件路径];
printf(“调用回调!!!\n”);
NSLog(@“从%@”获得FS更改通知,(u桥NPScannerServiceAgent*)用户数据);
尺寸i;
对于(i=0;i
默认情况下,XPC服务没有运行循环。尝试使用FSEventStreamSetDispatchQueue()
而不是FSEventStreamScheduleWithRunLoop()
在GCD队列而不是特定的运行循环上触发回调函数。感谢这一技巧,这是我不知道的非常有趣的一点。我一回去就试试。顺便说一句,为什么XPC没有运行循环?我认为当调用-resume方法时,它会创建自己的运行循环,因为它永远不会返回。要点如下:在XPC的info.plist集合RunLoopType
到NSRunLoop
中,请参阅苹果的文档以获取XPC服务属性列表键:
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]);
}
}