0

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

错误: “不能从捕获上下文的闭包中形成 AC 函数指针。”

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)
}
4

1 回答 1

1

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

但是根据您的小片段,它们中的(lc, cfg, state, message)任何一个都不像上下文指针。所以让自己回来仍然是可能的,但可能更复杂。因为您需要创建一个全局/静态数据,可以安全地从闭包内部访问。关于如何做到这一点的一些想法如下:

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

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

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

于 2018-04-17T03:59:21.073 回答