Двойной обратный вызов от Disk Arbitration при монтировании образа диска - PullRequest
2 голосов
/ 26 мая 2010

У меня проблема с использованием инфраструктуры DiskArbitration, чтобы поймать монтирование образа диска, я зарегистрировался для DARegisterDiskMountApprovalCallback. Проблема в том, что каждый раз, когда монтируется образ диска, обратный вызов вызывается дважды. Почему это так и как я могу это решить?

Ответы [ 4 ]

1 голос
/ 17 апреля 2014

Когда диск смонтирован, вы часто видите событие для всего диска, а затем события для отдельных разделов на этом диске. Вам нужно будет различить.

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) в ваш обработчик событий и посмотреть, что вы получите.

1 голос
/ 27 мая 2010

Я закончил тем, что кодировал что-то, чтобы обнаружить второе крепление и проигнорировать его.

0 голосов
/ 27 мая 2010

Вы поместили точку останова в свой обратный вызов, чтобы увидеть, что такое стек вызовов, когда он вызывается? Это может дать вам несколько советов о том, что происходит.

0 голосов
/ 26 мая 2010

Я использую эти уловы. Я не уверен в разнице между этим и тем, что вы делаете, но они работают.

[[[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]];
...