使用DiskArbitration在OSX中卸载磁盘

时间:2015-12-31 22:39:21

标签: objective-c macos diskarbitration

我正在尝试在OSX中卸载磁盘。代码工作正常,但只有当磁盘发出错误时,才会在磁盘卸载成功时调用回调。我阅读了DiskArbitrationProgGuide并按照步骤操作,但还没有进展。有人能给我一个帮助吗?

<div class="ui blue inverted piled segment ">
    <div class="ui items">
        <div class="item">
            <div class="content">
                <blockquote class="description">
                    <h3>Lorem ipsum dolor sit amet, consectetur adipisicing elit. </h3>
                </blockquote>
                <p class="meta">
                    <img class="ui avatar image"
                         src="http://">
                    <b>Édouard</b>, Lorem ipsum dolor sit amet.
                </p>
            </div>
        </div>
    </div>
</div>

正在更新。感谢Ken Thomases,现在代码正常运行

@interface DriverUtilitiesController()

void unmount_done(DADiskRef disk,
                  DADissenterRef dissenter,
                  void *context);

@end

+ (void)umnountDrivePath:(NSString *)voulumePath
{
    DASessionRef session = DASessionCreate(kCFAllocatorDefault);

    CFURLRef path = CFURLCreateWithString(NULL, (__bridge CFStringRef)voulumePath, NULL);

    DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, path);

    DADiskUnmount(disk, kDADiskUnmountOptionDefault, unmount_done, NULL);

    CFRelease(disk);
}

#pragma mark - Unmount Callback

void unmount_done(DADiskRef disk,
                  DADissenterRef dissenter,
                  void *context)
{

    NSLog(@"Inside unmount_done");

    if (dissenter)
    {
        // Unmount failed. //
        NSLog(@"Unmount failed.");

    } else {
        NSLog(@"Unmounted Volume");
    }
}

1 个答案:

答案 0 :(得分:3)

DADiskUnmount()以异步方式运行。在函数返回代码时,磁盘未必卸载。如果成功,可能会在以后的某个时间发生。您的回调将在那时被调用。

程序等待该事件并在响应中调用回调的机制是运行循环或调度队列。会话对象负责管理此等待和调用。您需要在运行循环或调度队列上安排会话对象。您可以使用DASessionScheduleWithRunLoop()DASessionSetDispatchQueue(),如Disk Arbitration Programming Guide: Using Disk Arbitration Notification and Approval Callbacks – Scheduling the Session with the Run Loop or Dispatch Queue中所述。

这意味着您不希望为每次卸载磁盘的尝试都创建新的会话对象。此外,您希望保留对会话对象的引用,以便在不再需要时可以取消计划并释放它(在您不再需要从中获取回调之后的某个时间)。