我已经使用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数组,但这也导致了严重的访问错误。
有没有更好的方法来做这件事?
发布于 2011-09-01 06:02:24
问题是事件流仍在计划中;停止它还不够。下面是我是如何做到的:
- (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也是如此。
https://stackoverflow.com/questions/7095985
复制相似问题