【问题标题】:Detect when a volume is mounted on OS X检测何时在 OS X 上安装卷
【发布时间】:2012-09-06 17:30:44
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c macos cocoa volumes


    【解决方案1】:

    注册到你从[[NSWorkspace sharedWorkspace] notificationCenter]收到的通知中心,然后处理你感兴趣的通知。这些是与音量相关的:NSWorkspaceDidRenameVolumeNotificationNSWorkspaceDidMountNotificationNSWorkspaceWillUnmountNotificationNSWorkspaceDidUnmountNotification

    【讨论】:

      【解决方案2】:

      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");
      }
      

      【讨论】:

        【解决方案3】:

        Swift 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
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 是否有理由在 NSWorkspace 上使用它,如下所述?这是一个第 3 方库,因此必须获得显着的好处才能说服我为项目添加额外的依赖项。
          猜你喜欢
          • 1970-01-01
          • 2013-09-13
          • 2013-12-21
          • 2010-10-28
          • 2013-08-23
          • 2014-12-14
          • 2011-10-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多