Изменение путей ToWatch в fsevents - PullRequest
0 голосов
/ 17 августа 2011

Я настроил механизм наблюдателя, используя 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, а затем снова запустить его, но я получаю exc_bad_access при повторном вызове FSEventStreamCreate.

Также пробовалнастройка массива pathsToWatch на лету, но это также вызвало ошибку неверного доступа.

Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 01 сентября 2011

Проблема заключалась в том, что поток событий все еще был запланирован;остановить это было недостаточно.Вот как я это сделал:

- (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 тоже.

...