所以我使用 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");
}
最佳答案
原因是 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
);
}
关于objective-c - 处理 OSX 中的文件系统事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14190166/