【发布时间】:2012-09-06 17:30:44
【问题描述】:
我有一个 OS X 应用程序需要响应正在装载或卸载的卷。
我已经通过定期检索卷列表并检查更改来解决这个问题,但我想知道是否有更好的方法。
【问题讨论】:
标签: objective-c macos cocoa volumes
我有一个 OS X 应用程序需要响应正在装载或卸载的卷。
我已经通过定期检索卷列表并检查更改来解决这个问题,但我想知道是否有更好的方法。
【问题讨论】:
标签: objective-c macos cocoa volumes
注册到你从[[NSWorkspace sharedWorkspace] notificationCenter]收到的通知中心,然后处理你感兴趣的通知。这些是与音量相关的:NSWorkspaceDidRenameVolumeNotification、NSWorkspaceDidMountNotification、NSWorkspaceWillUnmountNotification和NSWorkspaceDidUnmountNotification。
【讨论】:
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");
}
【讨论】:
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
【讨论】:
你知道SCEvents吗?它允许您在观察到的文件夹的内容发生更改时收到通知 (/Volumes)。这样您就不必使用计时器来定期检查内容。
【讨论】: