2011-08-17 3 views
0

fsevents를 사용하여 감시자 메커니즘을 설정했습니다. 요점은 파일이 폴더 X에서 생성 될 때마다, 나는 함수가 실행되기를 원합니다. 지금은 잘 돌아가고 있지만,보고있는 경로를 변경할 수 있어야합니다. 다음은 설정 코드입니다 : 내가 먼저 바로 FSEventStream를 중지 시도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); 

다음 다시 시작하지만, 다시 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 너무.