3

我将实现一个观察者,以便在特定卷消失时得到通知。

中的通知NSWorkspace不是一个选项,因为我需要有关设备关闭而不是设备卸载的通知。

注册很容易(我省略了错误处理)

var callbackSession : DASession?

let callbackSession = DASessionCreate(kCFAllocatorDefault)
DASessionSetDispatchQueue(callbackSession!, DispatchQueue.global())  
DARegisterDiskDisappearedCallback(callbackSession!, nil, volumeDidDisappearCallback, nil)

回调闭包是

let volumeDidDisappearCallback : DADiskDisappearedCallback = { (disk, context) in
   // do something with disk
}

注销方法

func DAUnregisterCallback(_ session: DASession, _ callback: UnsafeMutableRawPointer, _ context: UnsafeMutableRawPointer?)

需要一个泛型UnsafeMutableRawPointer而不是特定的回调类型之一。

当我将回调闭包传递给callback我得到的参数时

无法将类型“DADiskDisappearedCallback”(又名“@convention(c)(DADisk,可选)-> ()”)的值转换为预期的参数类型“UnsafeMutableRawPointer”

我的问题是:如何将回调对象转换volumeDidDisappearCallbackUnsafeMutableRawPointer

4

1 回答 1

3

DADiskDisappearedCallback定义为

public typealias DADiskDisappearedCallback = @convention(c) (DADisk, UnsafeMutableRawPointer?) -> Swift.Void

这是 C 函数指针的 Swift 映射

typedef void (*DADiskAppearedCallback)(DADiskRef disk, void *context);

注销函数在 C 中定义为

void DAUnregisterCallback(DASessionRef session, void *callback, void *context);

带有void *callback参数,并且在 C 中,您可以传递各种回调函数指针 ( DADiskAppearedCallback, DADiskDescriptionChangedCallback, ...) 而无需强制转换。

在 Swift 中,您必须将函数指针显式转换为 void 指针:

let cb = unsafeBitCast(volumeDidDisappearCallback, to: UnsafeMutableRawPointer.self)
DAUnregisterCallback(callbackSession!, cb, nil)
于 2016-11-02T21:47:15.227 回答