2012-09-13 46 views
7

Tôi có ứng dụng OS X cần phản hồi âm lượng đang được lắp hoặc tháo lắp.Phát hiện khi ổ đĩa được lắp trên OS X

Tôi đã giải quyết vấn đề này bằng cách truy xuất danh sách các tập theo định kỳ và kiểm tra các thay đổi, nhưng tôi muốn biết nếu có cách nào tốt hơn.

Trả lời

10

ký với trung tâm thông báo bạn nhận được từ [[NSWorkspace sharedWorkspace] notificationCenter] và sau đó xử lý các thông báo mà bạn đang quan tâm Đây là những khối lượng liên quan cái:. NSWorkspaceDidRenameVolumeNotification, NSWorkspaceDidMountNotification, NSWorkspaceWillUnmountNotificationNSWorkspaceDidUnmountNotification.

2

Bạn có biết SCEvents không? Nó cho phép bạn được thông báo khi nội dung của một thay đổi thư mục quan sát (/Volumes). Bằng cách này bạn không phải sử dụng bộ định thời để kiểm tra định kỳ nội dung.

+0

Có lý do nào để sử dụng điều này trên NSWorkspace như được mô tả bên dưới không? Đó là một thư viện của bên thứ 3, vì vậy các lợi ích sẽ phải có ý nghĩa để thuyết phục tôi bổ sung thêm sự phụ thuộc vào dự án. – Brian

15

Cách tiếp cận NSWorkspace chính xác là loại điều tôi đang tìm kiếm. Một vài dòng mã sau, tôi có một giải pháp tốt hơn nhiều so với sử dụng bộ hẹn giờ.

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

Swift 4 phiên bản:

Khai NSWorkspace trong applicationDidFinishLaunching và thêm các quan sát viên của lệnh mount và các sự kiện 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) 

Capture gắn kết và các sự kiện unmount trong:

@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) 
    } 
} 

Nó sẽ in đường dần đến device ví dụ/Volumes/EOS_DIGITAL Sau đây là các hằng số bạn có thể đọc từ UserInfo.

NSDevicePath, 
NSWorkspaceVolumeLocalizedNameKey 
NSWorkspaceVolumeURLKey 
Các vấn đề liên quan