Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在DiskArbitration framework中注销回调的正确语法_Macos_Swift3_Diskarbitration - Fatal编程技术网

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)