2013-01-07 35 views
0

所以即時通訊使用EventStream觀看文件夾進行更改。現在一切正常,當我修改文件夾中的文件時,我可以看到一個日誌回調,但我似乎無法調用我的folderWatch,它給出錯誤「使用未聲明的標識符'self'」。我可以在其他地方使用這個函數,而不是在fsEventsCallback中。任何幫助,將不勝感激!在OSX中處理文件系統事件

void fsEventsCallback(ConstFSEventStreamRef streamRef, 
         void *clientCallBackInfo, 
         size_t numEvents, 
         void *eventPaths, 
         const FSEventStreamEventFlags eventFlags[], 
         const FSEventStreamEventId eventIds[]){ 


    [self folderWatch]; 

    NSLog(@"2"); 
} 

回答

3

的原因是fsEventsCallback是一個C函數,而不是一個Objective-C的實例方法,所以fsEventsCallback不知道什麼self

您可以使用FSEventStreamContext中的info字段將self傳遞給回調函數。以下示例假設您的班級名爲Watcher

(如果你不使用ARC,你可以省略所有__bridge轉換。)

- (void)folderWatch 
{ 

} 

void fsEventsCallback(ConstFSEventStreamRef streamRef, 
         void *info, 
         size_t numEvents, 
         void *eventPaths, 
         const FSEventStreamEventFlags eventFlags[], 
         const FSEventStreamEventId eventIds[]) 
{ 
    Watcher *watcher = (__bridge Watcher *)info; 
    [watcher folderWatch]; 
} 

- (void)startWatching 
{ 
    FSEventStreamContext context; 
    context.info = (__bridge void *)(self); 
    context.version = 0; 
    context.retain = NULL; 
    context.release = NULL; 
    context.copyDescription = NULL; 

    NSArray *pathsToWatch = @[@"/path/to/watch"]; 

    self.eventStream = FSEventStreamCreate(NULL, 
           &fsEventsCallback, 
           &context, 
           (__bridge CFArrayRef)(pathsToWatch), 
           kFSEventStreamEventIdSinceNow, 
           1.0, 
           kFSEventStreamCreateFlagFileEvents 
           ); 
} 
+0

啊謝謝!我知道這肯定是一件容易的事情,哈哈 – urbanrider