2010-05-26 99 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)在你的事件處理程序,看看你會得到什麼。