У меня есть приложение OS X, которое должно реагировать на монтируемый или размонтируемый том.
Я уже решил эту проблему, периодически получая список томов и проверяя изменения, но я хотел бы знать, есть ли лучший способ.
У меня есть приложение OS X, которое должно реагировать на монтируемый или размонтируемый том.
Я уже решил эту проблему, периодически получая список томов и проверяя изменения, но я хотел бы знать, есть ли лучший способ.
Зарегистрируйтесь в центре уведомлений, который вы получаете от [[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");
}
Свифт 4 версия:
Объявите NSWorkspace в applicationDidFinishLaunching и добавьте наблюдателей для событий монтирования и размонтирования.
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
). Таким образом, вам не нужно использовать таймер для периодической проверки содержимого.