我试图监控目录,并在添加/删除/重命名文件时收到通知。我正在使用CDEvents Objective-C包装器。以下是我使用的代码:
self.events = [[CDEvents alloc] initWithURLs:@[self.programsFolder]
delegate:self
onRunLoop:[NSRunLoop currentRunLoop]
sinceEventIdentifier:kFSEventStreamEventIdSinceNow
notificationLantency:2
ignoreEventsFromSubDirs:NO
excludeURLs:nil
streamCreationFlags:kFSEventStreamCreateFlagFileEvents | kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagWatchRoot];
和委托方法:
- (void)URLWatcher:(CDEvents *)URLWatcher eventOccurred:(CDEvent *)event {
NSLog(@"event apparantly happened");
// just redo everything for now
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *startMenuFiles = [manager contentsOfDirectoryAtURL:_programsFolder
includingPropertiesForKeys:@[NSURLNameKey]
options:0
error:NULL];
NSMutableArray *newItems = [NSMutableArray new];
for (NSURL *startMenuFile in startMenuFiles) {
if (![[startMenuFile path] hasSuffix:@".plist"])
continue;
[newItems addObject:[[StartMenuItem alloc] initFromFile:startMenuFile]];
}
self.mutableItems = newItems;
}
但是当我在其监控的文件夹中创建文件或文件夹时,没有任何反应。您可以看到我添加了NSLog
,以便我知道事件何时发生。什么都没记录。
可能是什么问题?
如果您需要更多上下文,此项目的所有代码都位于http://github.com/vindo-app/vindo。查看代码>开始> Xcode中的StartMenu.m。
答案 0 :(得分:0)
问题在于初始化FSEvents源。您必须提供运行循环来监视事件。此代码是从主线程以外的线程调用的,因此[NSRunLoop currentRunLoop]
不是主线程的运行循环。我将其更改为[NSRunLoop mainRunLoop]
,这解决了问题。