Двойной обратный вызов от 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]];