Macos 在DiskArbitration framework中注销回调的正确语法
我将实现一个观察者,在特定卷消失时得到通知Macos 在DiskArbitration framework中注销回调的正确语法,macos,swift3,diskarbitration,Macos,Swift3,Diskarbitration,我将实现一个观察者,在特定卷消失时得到通知 NSWorkspace中的通知不是选项,因为我需要关于设备关闭的通知,而不是关于设备卸载的通知 注册非常简单(我省略了错误处理) 回调闭包是 let volumeDidDisappearCallback : DADiskDisappearedCallback = { (disk, context) in // do something with disk } 注销方法 func DAUnregisterCallback(_ session:
NSWorkspace
中的通知不是选项,因为我需要关于设备关闭的通知,而不是关于设备卸载的通知
注册非常简单(我省略了错误处理)
回调闭包是
let volumeDidDisappearCallback : DADiskDisappearedCallback = { (disk, context) in
// do something with disk
}
注销方法
func DAUnregisterCallback(_ session: DASession, _ callback: UnsafeMutableRawPointer, _ context: UnsafeMutableRawPointer?)
需要一个泛型UnsafemeutableRawPointer
,而不是一个特定的回调类型
当我将回调闭包传递给callback
参数时,我得到
无法将类型为“DADiskDisappearedCallback”(又名“@convention(c)(DADisk,可选)->()”)的值转换为预期的参数类型“UnsafemtableRawPointer”
我的问题是:如何将回调对象
volumedidspearcallback
转换为unsafemtablerawpointer
?DADiskDisappearedCallback
定义为
public typealias DADiskDisappearedCallback = @convention(c) (DADisk, UnsafeMutableRawPointer?) -> Swift.Void
这是C函数指针的快速映射
typedef void (*DADiskAppearedCallback)(DADiskRef disk, void *context);
unregister函数在C中定义为
void DAUnregisterCallback(DASessionRef session, void *callback, void *context);
使用void*callback
参数,在C中可以传递各种
各种回调函数指针(dadiskapearedcallback
,DADiskDescriptionChangedCallback
,…),无需强制转换
在Swift中,必须将函数指针显式转换为空指针:
let cb = unsafeBitCast(volumeDidDisappearCallback, to: UnsafeMutableRawPointer.self)
DAUnregisterCallback(callbackSession!, cb, nil)
将
unsafeBitCast(volumediddispearcallback,to:UnsafeMutableRawPointer.self)
传递到注销函数是否有效?@MartinR即使没有注销回调,它也有效,但我希望正确释放资源。如果我使闭包可变并传递&volumediddispearcallback
,它将编译,但这是否有效?您的建议也会编译。回调类型声明为@convention(c)
,因此这本质上是一个(c兼容的)函数指针。因此,将其转换为指针可能是正确的。但是我还没有测试。谢谢,我也会测试的。我刚刚将一个ObjC项目移植到Swift,在这个问题上陷入了困境。
let cb = unsafeBitCast(volumeDidDisappearCallback, to: UnsafeMutableRawPointer.self)
DAUnregisterCallback(callbackSession!, cb, nil)