Cocoa在NSArray中获取磁盘

时间:2012-08-01 18:31:52

标签: cocoa iokit diskarbitration

您好我使用DiskArbitration.framework获取磁盘列表

+(NSArray*)arrayOfDisks {
    DASessionRef session = DASessionCreate(kCFAllocatorDefault);
    if (session) {
        DARegisterDiskAppearedCallback(session, NULL, driveGo, NULL);
        DASessionScheduleWithRunLoop(session,
                                     CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
        CFRelease(session);
    }
    return nil;
}

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

它记录得很好,但我怎样才能返回数组? 它只是循环所以我甚至不知道如何检查它是否完成。

2 个答案:

答案 0 :(得分:0)

您可以更改方法并将数组存储在私有变量中:

(void*) driveGo(DADiskRef disk, void *context) {
NSLog(@"%s", DADiskGetBSDName(disk));
self->_myArray = DADiskGetBSDName(disk);

}

答案 1 :(得分:0)

  

它只是循环所以我甚至不知道如何检查是否已完成。

没有“完成”。您的回调将针对DiskArb 当前已知的每个“磁盘”和从那时出现的每个“磁盘”进行调用。两者之间没有分离。

大多数应用程序应该使用它,而不是反对它。让DiskArb告诉您新的“磁盘”出现,更改(DescriptionChanged),安装或卸载(也是DescriptionChanged)或消失的时刻。随着这些变化的到来,让您的信息保持最新,并始终保持当前状态。

大多数应用程序不需要获取当前已安装卷集的完整且固定的快照。但是,如果出于某种原因,您可以尝试使用getmntinfo函数。