首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改fsevents中的pathsToWatch

更改fsevents中的pathsToWatch
EN

Stack Overflow用户
提问于 2011-08-18 00:05:32
回答 1查看 829关注 0票数 0

我已经使用fsevents设置了一个监视器机制。它的要点是,每次在文件夹X中创建一个文件时,我都希望运行一个函数。它现在运行得很好,但我需要能够更改它正在监视的路径。下面是设置代码:

代码语言:javascript
复制
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数组,但这也导致了严重的访问错误。

有没有更好的方法来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-01 06:02:24

问题是事件流仍在计划中;停止它还不够。下面是我是如何做到的:

代码语言:javascript
复制
- (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也是如此。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7095985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档