Двойной обратный вызов от Disk Arbitration при монтировании образа диска

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

4 ответа

Решение

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

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

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

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

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

[[[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]];
Другие вопросы по тегам