我正在尝试在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");
}
}
答案 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中所述。
这意味着您不希望为每次卸载磁盘的尝试都创建新的会话对象。此外,您希望保留对会话对象的引用,以便在不再需要时可以取消计划并释放它(在您不再需要从中获取回调之后的某个时间)。