【问题标题】:Changing the pathsToWatch in fsevents更改 fsevents 中的 pathsToWatch
【发布时间】:2011-08-17 16:05:31
【问题描述】:

我已经使用 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 数组,但这也导致了错误的访问错误。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: cocoa fsevents


    【解决方案1】:

    问题在于事件流仍在计划中;停止它是不够的。我是这样做的:

    - (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 也是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      相关资源
      最近更新 更多