Cocoa 在fsevents中更改pathsToWatch
我已经使用fsevents设置了一个监视机制。要点是每次在文件夹X中创建文件时,我都希望运行一个函数。它现在运行良好,但我需要能够改变它正在观察的路径。以下是设置代码:Cocoa 在fsevents中更改pathsToWatch,cocoa,fsevents,Cocoa,Fsevents,我已经使用fsevents设置了一个监视机制。要点是每次在文件夹X中创建文件时,我都希望运行一个函数。它现在运行良好,但我需要能够改变它正在观察的路径。以下是设置代码: void *appPointer = (void *)self; NSString *myPath = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] stringForKey:@"FolderPath"]; NSArray *pathsTo
void *appPointer = (void *)self;
NSString *myPath = [[[NSUserDefaultsController sharedUserDefaultsController] defaults] stringForKey:@"FolderPath"];
NSArray *pathsToWatch = [NSArray arrayWithObject:myPath];
FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
NSTimeInterval latency = 1.0;
stream = FSEventStreamCreate(NULL,
&fsevents_callback,
&context,
(CFArrayRef) pathsToWatch,
[lastEventId unsignedLongLongValue],
(CFAbsoluteTime) latency,
kFSEventStreamCreateFlagUseCFTypes
);
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
我首先尝试停止FSEventStream,然后再次启动它,但是当再次调用FSEventStreamCreate
时,我得到了一个exc\u bad\u访问权限
还尝试动态调整pathsToWatch
数组,但这也导致了错误的访问
有更好的方法吗?问题是事件流仍在计划中;仅仅停止是不够的。我是这样做的:
- (void)initializeEventStream {
void *appPointer = (void *)self;
FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
NSTimeInterval latency = 1.0;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *pathsToWatch = [NSArray arrayWithObject:[defaults stringForKey:@"SomeKey"]];
stream = FSEventStreamCreate(NULL,
&fsevents_callback,
&context,
(CFArrayRef) pathsToWatch,
[lastEventId unsignedLongLongValue],
(CFAbsoluteTime) latency,
kFSEventStreamCreateFlagUseCFTypes
);
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
}
- (void)stopEventStream {
FSEventStreamStop(stream);
FSEventStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
}
基本上与我在问题中列出的内容相同,但也有FSEventStreamUnscheduleFromRunLoop
。问题是事件流仍然被调度;仅仅停止是不够的。我是这样做的:
- (void)initializeEventStream {
void *appPointer = (void *)self;
FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
NSTimeInterval latency = 1.0;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *pathsToWatch = [NSArray arrayWithObject:[defaults stringForKey:@"SomeKey"]];
stream = FSEventStreamCreate(NULL,
&fsevents_callback,
&context,
(CFArrayRef) pathsToWatch,
[lastEventId unsignedLongLongValue],
(CFAbsoluteTime) latency,
kFSEventStreamCreateFlagUseCFTypes
);
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
}
- (void)stopEventStream {
FSEventStreamStop(stream);
FSEventStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
}
基本上与我在问题中列出的内容相同,但也使用了FSEventStreamUnscheduleFromRunLoop