Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 为什么FSEvent stream不给我任何事件?_Macos_Cocoa_Fsevents - Fatal编程技术网

Macos 为什么FSEvent stream不给我任何事件?

Macos 为什么FSEvent stream不给我任何事件?,macos,cocoa,fsevents,Macos,Cocoa,Fsevents,我正在尝试监视目录,并在添加/删除/重命名文件时收到通知。我正在使用CDEvents Objective-C包装器。以下是我使用的代码: self.events = [[CDEvents alloc] initWithURLs:@[self.programsFolder] delegate:self onRunLoop:[NSRunLoop current

我正在尝试监视目录,并在添加/删除/重命名文件时收到通知。我正在使用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
,这样我就可以知道事件何时发生。没有任何记录

有什么问题吗


如果您需要更多的上下文,此项目的所有代码都位于。查看Xcode中的Code>Start>StartMenu.m。

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

你在哪个线程上调用初始化器方法?它恰好是由NSOperationQueue创建的线程…这与此有关吗?@Kenthomass也许你会知道:为什么winemenubuilder中的Mac图标提取代码会将图标放在/tmp中?我现在觉得很愚蠢。错误的运行循环。关于winemenubuilder,提交历史记录中没有任何指示。实施它的人就是这样做的。我不知道他有什么计划,因为winemenubuilder在Mac上没有什么合适的事情要做。它不必是主线程,只需要是一个由你控制的线程,这样你就可以确保它持续并运行它的运行循环。也就是说,主线程是一个很好的选择,只要您响应FS事件所做的任何工作都是快速的或移动到另一个线程。