2010-05-26 62 views
2

我在使用DiskArbitration框架时遇到了一个问题,请注册磁盘映像挂载我注册为DARegisterDiskMountApprovalCallback。问题是每次挂载磁盘映像时,都会调用两次回调。为什么是这样的,我该如何解决这个问题?安装磁盘映像时从磁盘仲裁中进行双重回调

回答

1

我编写了一些东西来检测第二个挂载并忽略它。

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]]; 
+1

我不能使用NSWorkspace,它来自不是守护进程不安全的appKit,我需要将它作为守护进程运行。 – Nyx0uf 2010-05-26 18:23:54

0

你把一个断点在你的回调,看看哪些调用堆栈时,它被称为?它可以给你一些提示发生了什么。

+0

大部分时间我只有一次点击断点.. – Nyx0uf 2010-05-26 20:50:50

+0

@Nyxem当它被击两次时,callstack会给你一些信息吗? – 2010-05-26 20:55:03

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)在你的事件处理程序,看看你会得到什么。