我刚刚开始在这个古怪的编程世界中,我遇到了一个非常令人沮丧的问题:
我正在尝试使用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文档对此非常模糊......或者我完全错过了一些东西
答案 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];
}