Дисковый арбитраж Цель 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];
}