所以我使用EventStream来观察文件夹的变化。现在一切正常,当我改变文件夹中的文件时,我可以看到日志回调,但我似乎无法调用我的folderWatch,它给出错误“使用未声明的标识符'self'”。我可以在其他地方使用此函数,而不是在fsEventsCallback中。任何帮助将不胜感激!
void fsEventsCallback(ConstFSEventStreamRef streamRef,
void *clientCallBackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[]){
[self folderWatch];
NSLog(@"2");
}
答案 0 :(得分:3)
原因是fsEventsCallback
是C函数而不是Objective-C实例方法,因此fsEventsCallback
对self
一无所知。
您可以使用info
中的FSEventStreamContext
字段将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
);
}