Swift 无法在 linphone sdk 中从 c 回调调用自身



尝试从 c 回调调用 Swift 实例方法时遇到问题。

错误:">C 函数指针不能从捕获上下文的闭包形成。

linphone_core_cbs_set_registration_state_changed(cbs) { (lc, cfg, state, message) in            
switch state{ 
case LinphoneRegistrationOk:
print("LinphoneRegistrationOk")        
self.call()        
}
func call() {        
let account = "test"
let domain = "sip.linphone.org"
let identity = "sip:" + account + "@" + domain
linphone_core_invite(lc, identity)
}

如果您能够将任意void*作为上下文传递,那么使用Unmanaged<SelfType>.passUnretained(self).toOpaque()并使用Unmanaged<SelfType>.fromOpaque(context).takeUnretainedValue()将其转换回来是最好的解决方案。

但是根据你的一小段(lc, cfg, state, message)它们似乎都不像上下文指针。因此,找回自我仍然是可能的,但可能更复杂。因为您需要创建一个全局/静态数据,这些数据可以从闭包内部以安全的方式访问。有关如何执行此操作的一些想法如下:

1)如果你知道这是安全的,你可以只用一个简单的全局/静态来做到这一点。

2)您可以使用线程本地存储并存储指向self的指针,并以与使用void*参数并使用Unmanaged相同的方式来回转换它。这当然要求在存储值的同一线程上引发 C 回调。

3) 如果你可以访问 Swift 和 C 都可以访问的唯一标识符,该标识符将在你的回调中继续有效和可访问,你可以创建一个[UniqueIdentifierAccessibleBySwiftAndC: TypeOfSelf]类型的映射,并使用它来获取self

相关内容

  • 没有找到相关文章

最新更新