Macos 为什么FSEvent stream不给我任何事件?
我正在尝试监视目录,并在添加/删除/重命名文件时收到通知。我正在使用CDEvents Objective-C包装器。以下是我使用的代码:Macos 为什么FSEvent stream不给我任何事件?,macos,cocoa,fsevents,Macos,Cocoa,Fsevents,我正在尝试监视目录,并在添加/删除/重命名文件时收到通知。我正在使用CDEvents Objective-C包装器。以下是我使用的代码: self.events = [[CDEvents alloc] initWithURLs:@[self.programsFolder] delegate:self onRunLoop:[NSRunLoop current
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
,这样我就可以知道事件何时发生。没有任何记录
有什么问题吗
如果您需要更多的上下文,此项目的所有代码都位于。查看Xcode中的Code>Start>StartMenu.m。问题在于初始化FSEvents源。您必须提供一个运行循环来监视事件。此代码是从主线程以外的线程调用的,因此
[nsrunlop currentRunLoop]
不是主线程的运行循环。我将其更改为[nsrunlop mainlunloop]
,这就解决了问题。你在哪个线程上调用初始化器方法?它恰好是由NSOperationQueue创建的线程…这与此有关吗?@Kenthomass也许你会知道:为什么winemenubuilder中的Mac图标提取代码会将图标放在/tmp中?我现在觉得很愚蠢。错误的运行循环。关于winemenubuilder,提交历史记录中没有任何指示。实施它的人就是这样做的。我不知道他有什么计划,因为winemenubuilder在Mac上没有什么合适的事情要做。它不必是主线程,只需要是一个由你控制的线程,这样你就可以确保它持续并运行它的运行循环。也就是说,主线程是一个很好的选择,只要您响应FS事件所做的任何工作都是快速的或移动到另一个线程。