在fsevents中更改pathsToWatch
我已经使用fsevents建立了一个观察器机制。 它的要点是每次在文件夹X中创建一个文件,我想要一个函数来运行。 现在运行良好,但我需要能够改变它正在观看的路径。 这里是设置代码:
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_bad_access
。
还尝试了pathsToWatch
调整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
。
上一篇: Changing the pathsToWatch in fsevents
下一篇: Using NSFileManager to get the modified date of a copied file