我在使用DiskArbitration框架时遇到问题,要抓住我注册DARegisterDiskMountApprovalCallback
的磁盘映像。问题是每次安装磁盘映像时,都会调用两次回调。为什么这样,我该如何解决?
答案 0 :(得分:1)
我最终编写了一些东西以检测第二个装载并忽略它。
答案 1 :(得分:1)
安装磁盘时,您经常会看到整个磁盘的事件,然后是该磁盘上不同分区的事件。你需要区分。
static void got_disk(DADiskRef disk, void *context)
{
CFDictionaryRef dict = DADiskCopyDescription(disk);
NSNumber *whole = CFDictionaryGetValue(dict, kDADiskDescriptionMediaWholeKey);
if (![whole boolValue]) {
// Handle your event only with the partition, not the "whole" disk
...
}
}
在您的事件处理程序中添加CFShow(dict)
并查看您获得的内容非常方便。
答案 2 :(得分:0)
我用这些抓住了。我不确定这些与你正在做什么有什么不同,但是他们有效。
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(mediaMounted:) name:NSWorkspaceDidMountNotification object:[NSWorkspace sharedWorkspace]];
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(mediaUnmounted:) name:NSWorkspaceWillUnmountNotification object:[NSWorkspace sharedWorkspace]];
答案 3 :(得分:0)
你是否在回调中放置了一个断点来查看调用它时的调用堆栈是什么?它可以为您提供有关正在发生的事情的一些提示。