为什么FSEvent流没有给我任何事件?

时间:2015-10-09 21:41:43

标签: macos cocoa fsevents

我试图监控目录,并在添加/删除/重命名文件时收到通知。我正在使用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。

1 个答案:

答案 0 :(得分:0)

问题在于初始化FSEvents源。您必须提供运行循环来监视事件。此代码是从主线程以外的线程调用的,因此[NSRunLoop currentRunLoop]不是主线程的运行循环。我将其更改为[NSRunLoop mainRunLoop],这解决了问题。