0

こんにちは私は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));
}

正常にログに記録されますが、配列を元に戻すにはどうすればよいですか?ループするだけなので、それが行われたかどうかを確認する方法さえわかりません。

4

2 に答える 2

0

メソッドを変更して、配列をプライベート変数に格納できます。

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

}

于 2012-08-01T18:35:40.510 に答える
0

ループするだけなので、それが行われたかどうかを確認する方法さえわかりません。

「完了」はありません。コールバックは、DiskArb現在認識されているすべての「ディスク」と、それ以降に表示されるすべての「ディスク」に対して呼び出されます。2つの間に分離はありません。

ほとんどのアプリケーションは、それに反対するのではなく、それで動作するはずです。DiskArbに、新しい「ディスク」が表示された瞬間、変更された瞬間(DescriptionChanged)、マウントまたはマウント解除された瞬間(DescriptionChangedも)、または消えた瞬間を知らせます。これらの変更が発生したときに情報を最新の状態に保ち、常に最新の状態にします。

ほとんどのアプリケーションは、マウントされたボリュームの現在のセットの完全で固定されたスナップショットを取得する必要はありません。getmntinfoただし、何らかの理由で実行する場合は、代わりに関数を試してみてください。

于 2013-12-19T21:47:11.373 に答える