【问题标题】:Calling C++ method with callback from ObjectiveC使用来自 Objective C 的回调调用 C++ 方法
【发布时间】:2017-01-23 12:13:45
【问题描述】:

我需要调用一个 C++ 方法并传入一个 callback 方法作为参数...来自 ObjectiveC 方法... 然后,这个回调方法将在 ObjectiveC 中被触发多次......因为它是一个回调......所以我需要将那个 ObjectiveC 回调方法捕获回来,因为它将作为 Swift 代码的闭包被调用......

这是 C++ 方法签名

static bool cPlusPlusMethodWithCallBack(const std::string& someText, void (*someCallback)(unsigned int) = NULL, unsigned int someNum = 0);

我的问题是在 ObjectiveC 中声明的这个回调方法的块语法应该是什么(在 .mm 和 .h 中),然后可以将其作为参数传递给 C++ 中的 someCallback

我是一名 Swift 开发人员,所以有点卡在 ObjectiveC 上...非常感谢

【问题讨论】:

    标签: c++ objective-c swift objective-c-blocks objective-c++


    【解决方案1】:

    您不能像这样将 Objective-C 块(或 Swift 闭包)作为函数指针参数传递。您需要创建一个单独的独立函数,并将其作为回调传递。

    void MyCallback(unsigned int value)
    {
        // ...do something...
    }
    

    在你的主代码中:

    cPlusPlusMethodWithCallBack("something", MyCallback);
    

    现在,这样做的缺点是,在您的回调中,您通常需要引用特定的 Objective-C 对象才能正确处理回调。如果这是您对这个特定回调的需要,您需要将它作为静态变量保存在某个地方,以便可以从MyCallback 函数访问它。

    或者,如果您可以控制cPlusPlusMethodWithCallBack 源代码,则可以将其更新为采用void *“引用”参数,然后在调用回调时将该参数作为参数提供:

    static void cPlusPlusMethodWithCallback(void (*callback)(void *ref), void *ref)
    {
        // ...really time consuming processing...
        callback(ref);
    }
    

    然后,更新你的回调函数:

    void MyCallback(void *ref)
    {
        ObjectiveCObject *obj = (ObjectiveCObject *)ref;
        [obj doSomething];
    }
    

    而当你最初调用方法时,只需传入你需要的对象作为引用参数:

    cPlusPlusMethodWithCallback(MyCallback, myObjectiveCObject);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多