13

我有一个 OS X 应用程序需要响应正在安装或卸载的卷。

我已经通过定期检索卷列表并检查更改来解决这个问题,但我想知道是否有更好的方法。

4

4 回答 4

16

注册到您收到的通知中心[[NSWorkspace sharedWorkspace] notificationCenter],然后处理您感兴趣的通知。这些是与卷相关的:NSWorkspaceDidRenameVolumeNotificationNSWorkspaceDidMountNotification和。NSWorkspaceWillUnmountNotificationNSWorkspaceDidUnmountNotification

于 2012-09-13T15:36:30.577 回答
16

这种NSWorkspace方法正是我正在寻找的那种东西。几行代码之后,我有一个比使用计时器更好的解决方案。

-(void) monitorVolumes
{
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(volumesChanged:) name:NSWorkspaceDidMountNotification object: nil];
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(volumesChanged:) name:NSWorkspaceDidUnmountNotification object:nil];
}

-(void) volumesChanged: (NSNotification*) notification
{
    NSLog(@"dostuff");
}
于 2012-09-13T16:07:13.120 回答
6

斯威夫特 4 版本:

在 applicationDidFinishLaunching 中声明 NSWorkspace 并为 mount 和 unmount 事件添加观察者。

let workspace = NSWorkspace.shared

workspace.notificationCenter.addObserver(self, selector: #selector(didMount(_:)), name: NSWorkspace.didMountNotification, object: nil)
workspace.notificationCenter.addObserver(self, selector: #selector(didUnMount(_:)), name: NSWorkspace.didUnmountNotification, object: nil)

在以下位置捕获安装和卸载事件:

@objc func didMount(_ notification: NSNotification)  {
    if let devicePath = notification.userInfo!["NSDevicePath"] as? String {
        print(devicePath)
    }
}
@objc func didUnMount(_ notification: NSNotification)  {
    if let devicePath = notification.userInfo!["NSDevicePath"] as? String {
        print(devicePath)
    }
}

它将打印设备路径,例如 /Volumes/EOS_DIGITAL 以下是您可以从 userInfo 读取的常量。

NSDevicePath, 
NSWorkspaceVolumeLocalizedNameKey
NSWorkspaceVolumeURLKey
于 2017-10-11T10:04:34.840 回答
3

你知道SCEvents吗?它允许您在观察到的文件夹的内容发生更改时收到通知 ( /Volumes)。这样您就不必使用计时器来定期检查内容。

于 2012-09-13T15:19:21.033 回答