2011-08-17 24 views
0

我已經使用fsevents設置了一個觀察器機制。它的要點是每次在文件夾X中創建一個文件,我想要一個函數來運行。現在運行良好,但我需要能夠改變它正在觀看的路徑。下面是設置代碼:在fsevents中更改pathsToWatch

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陣列,但也導致訪問錯誤。

有沒有更好的方法來做到這一點?

回答

3

問題在於事件流仍在計劃中;阻止它是不夠的。以下是我做的:

- (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