You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS使用DiskManagement.framework格式化磁盘后代码停滞问题求助

解决DMEraseDisk调用后应用冻结及后续执行问题

核心问题分析

直接调用同步eraseDisk会阻塞主线程导致应用冻结;异步模式下错误使用CFRunLoopRun(),会导致RunLoop无法正确退出、回调事件未被监听,进而后续代码无法执行。另外格式化后需手动挂载,是因为DMEraseDisk默认不会触发自动挂载逻辑。

解决方案

1. 采用异步代理回调模式

放弃强行阻塞RunLoop的方式,通过DMEraseDiskDelegate代理回调感知任务完成状态,保证主线程不被阻塞。

步骤1:遵守代理协议

让你的业务类实现DMEraseDiskDelegate协议:

@interface YourDiskHandler () <DMEraseDiskDelegate>
@end

步骤2:初始化异步擦除任务

获取目标磁盘、文件系统实例后,以异步模式启动格式化:

// 假设已通过DMManager拿到目标DMDisk实例
DMDisk *targetDisk = ...;
// 指定格式化的文件系统(例如APFS)
DMFilesystem *fs = [[DMManager sharedManager] filesystemForType:kDMFilesystemTypeAPFS];

// 初始化擦除任务
DMEraseDisk *eraseTask = [[DMEraseDisk alloc] initWithDisk:targetDisk filesystem:fs];
eraseTask.delegate = self;
// 传入NO启用异步模式
[eraseTask eraseDisk:NO];

步骤3:实现代理回调处理后续逻辑

在代理方法中处理格式化结果,并主动触发磁盘挂载:

- (void)eraseDisk:(DMEraseDisk *)eraseDisk didFinishWithError:(NSError *)error {
    if (!error) {
        NSLog(@"磁盘格式化完成");
        // 自动挂载格式化后的磁盘
        DMDisk *formattedDisk = eraseDisk.disk;
        [[DMManager sharedManager] mountDisk:formattedDisk 
                                     options:kDMMountOptionNone 
                          completionHandler:^(BOOL success, NSError * _Nullable mountError) {
            if (success) {
                NSLog(@"磁盘挂载成功");
                // 执行后续业务代码
                [self runPostFormatOperations];
            } else {
                NSLog(@"挂载失败: %@", mountError.localizedDescription);
            }
        }];
    } else {
        NSLog(@"格式化失败: %@", error.localizedDescription);
    }
}

- (void)runPostFormatOperations {
    // 这里编写格式化完成后的业务逻辑
}

2. 修正RunLoop使用方式(若必须用)

如果之前依赖CFRunLoopRun(),必须在代理回调中主动终止RunLoop,避免主线程永久阻塞:

- (void)eraseDisk:(DMEraseDisk *)eraseDisk didFinishWithError:(NSError *)error {
    // 处理结果逻辑...
    CFRunLoopStop(CFRunLoopGetCurrent());
}

3. 权限检查

确保应用拥有磁盘管理权限(如辅助功能权限),否则可能出现回调不触发、操作失败的情况,可提前在代码中检查权限或提示用户授权。

关键提示

  • DMEraseDisk的异步模式必须通过代理回调感知完成状态,不可依赖同步阻塞逻辑。
  • 格式化完成后需主动调用DMManager的mountDisk:options:completionHandler:方法挂载磁盘,这是私有框架的设计要求。
  • 若后续涉及UI操作,需在回调中切回主线程执行,避免界面卡顿。

内容的提问来源于stack exchange,提问作者TechUnRestricted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:50:25