【问题标题】:Swift can't call self from c callback in linphone sdkSwift 无法从 linphone sdk 中的 c 回调调用 self
【发布时间】:2018-04-16 07:37:43
【问题描述】:

尝试从 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)
}

【问题讨论】:

标签: c swift callback linphone linphone-sdk


【解决方案1】:

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

但是根据您的(lc, cfg, state, message) 小sn-p,它们看起来都不像上下文指针。所以让自己回来仍然是可能的,但可能更复杂。因为您需要创建一个全局/静态数据,可以安全地从闭包内部访问。以下是有关如何执行此操作的一些想法:

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

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

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

【讨论】:

  • 谢谢你的解决方案很丰富
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多