磁盘仲裁目标C:将所有驱动器和分区放入阵列中

时间:2014-05-30 01:30:22

标签: objective-c arrays callback diskarbitration

我刚刚开始在这个古怪的编程世界中,我遇到了一个非常令人沮丧的问题:

我正在尝试使用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

如您所见,一切都记录正常。问题是我想以某种方式返回“theDisk”对象所以我可以使用它。

由于回调函数无效,我无法执行return语句。如果我尝试修改函数的返回类型,则DARegisterDiskAppearedCallback函数将无法完全运行。

同样,我的唯一目标是获取有关计算机上所有磁盘和分区的信息,并将它们放入一个数组中,以便我可以获取有关它们的信息并对其进行操作。

此外,任何人都可以解释何时会在回调函数中放入“(void *)context”中的内容? Apple文档对此非常模糊......或者我完全错过了一些东西

1 个答案:

答案 0 :(得分: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];
}