Дисковый арбитраж Цель C: поместить все диски и разделы в массив

Я только начинаю в этом дурацком мире программирования и столкнулся с очень неприятной проблемой:

Я пытаюсь использовать Disk Arbitration Framework, чтобы поместить все диски в массив.

#import "DiskDetector.h"
#import "Disk.h"
@implementation DiskDetector

-(id)init {
    self.arrayOfDisks = [[NSMutableArray alloc]init];
    DASessionRef session;

    session = DASessionCreate(kCFAllocatorDefault);

    DARegisterDiskAppearedCallback(session, kDADiskDescriptionMatchVolumeMountable,diskAppearedCallback,NULL);
    DARegisterDiskDisappearedCallback(session,kDADiskDescriptionMatchVolumeMountable, diskDisappearedCallback, NULL);
    DASessionScheduleWithRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);


    return self;
}
-(void)addToArrayOfDisks:(Disk*)disk {

}

void diskAppearedCallback(DADiskRef disk, void* context)
{
    Disk *theDisk = [[Disk alloc]initWithNewDisk:disk];
    NSLog(@"Disk Name: %@",theDisk.diskName);
    NSLog(@"Disk Number: %@",theDisk.diskBSDName);
    NSLog(@"Disk Connection Type: %@",theDisk.diskConnection);
    NSLog(@"Disk Capacity in Bytes: %@",theDisk.diskTotalCapacityInBytes);
    NSLog(@"Volume Name: %@",theDisk.partitionScheme);

    //How Do I return "theDisk" from this function?
    //[self.arrayOfDisks addObject:theDisk] does not work...complier has problem with    use of "self"
}

void diskDisappearedCallback(DADiskRef disk, void* context)
{
    NSLog(@"%s was ejected", DADiskGetBSDName(disk));
}


@end

Как видите, все логируется нормально. Проблема в том, что я хочу каким-то образом вернуть объект "Диск", чтобы я мог работать с ним.

Поскольку функция обратного вызова недействительна, я не могу сделать оператор возврата. Если я попытаюсь изменить тип возвращаемого значения функции, функция DARegisterDiskAppearedCallback не будет работать полностью.

Опять же, моя единственная цель здесь - получить информацию обо всех дисках и разделах на компьютере и поместить их в массив, чтобы я мог получить информацию о них и манипулировать ими.

Кроме того, кто-нибудь может объяснить, когда кто-то поместил бы что-то в "(void*)context" в функции обратного вызова? Документация Apple очень расплывчата по этому вопросу... или, может быть, я что-то упустил

1 ответ

Решение

context Параметр для вашего использования. Вы можете установить в качестве контекста все, что захотите, и DiskArbitration передаст его вам при вызове обратного вызова. Вы можете использовать это для решения вашей первой проблемы, передавая объект DiskDetector в качестве контекста:

-(id)init {
    // ...
    DARegisterDiskAppearedCallback(session, kDADiskDescriptionMatchVolumeMountable, diskAppearedCallback, self);
    // ...
}
void diskAppearedCallback(DADiskRef disk, void* context) {
    DiskDetector *detector = (DiskDetector *)context;
    // ...
    [detector.arrayOfDisks addObject:theDisk];
}
Другие вопросы по тегам