从 c++ 通知 iOS 应用程序中的 UI

Posted

技术标签:

【中文标题】从 c++ 通知 iOS 应用程序中的 UI【英文标题】:Notify from c++ to UI in iOS app 【发布时间】:2014-08-08 15:23:36 【问题描述】:

我正在使用音频单元在 ios 7 上开发音频生成器,并将样本渲染到 cpp 文件中。我的问题是我需要在渲染期间将输出量通知给用 c++ 计算的 UI。

我怎样才能做到这一点?如果我可以从 cpp 文件中调用一个客观的 C 方法就足够了。

【问题讨论】:

您可以将代码编译为 Objective-C++ - 最简单的方法是将您的 .cpp 重命名为 .mm。然后它将正确编译,您可以(在大多数情况下)随意混合 Objective-C 和 C++。 感谢您的快速回复!这会使 cpp 代码有所不同吗?我的意思是,如果我将cpp代码编译为Objective-C++,可能代码执行会更慢......还有其他缺点吗? objective-c++ 与 c++ 一样快。这与 Objective-c 与 c 的关系相同。 【参考方案1】:

实际上你有两个问题需要解决:

从 C++ 到 Objective-C 跨越从 CoreAudio 渲染线程到 UI 线程的线程边界。

从 C++ 到 Objective-C 很简单:将 C++ 文件编译为 Objective-C++(使用 .mm 扩展名重命名)。

一旦你这样做了,你的 C++ 类就可以包含一个 Objective-C 对象的指针成员,并且方法实现可以向 Objective-C 对象发送消息。相反,您的 Objective-C++ 对象可以管理 C++ 对象并调用它们的方法。

要跨越线程边界,请使用 Grand Central Dispatch。

@interface ObjectiveCBar;

- (void) onVolumeEvent:(float) volume;

@end


class Foo

   void notifyUI(float volume)
   
       dispatch_async(dispatch_get_main_queue(), ^
                    
                [objectiveCObject onVolumeEvent:volume];
            );
   

   ObjectiveCBar     *objectiveCObject;

您还可以使用NSNotificationCentre 解耦代码的 C++ 和 Objective-C 部分。为此,您需要在队列中传递一个 Objective-C 对象

【讨论】:

感谢您的精彩回复。我只有最后一个问题让我想知道:如果我将 cpp 重命名为 files 为 mm 文件而不更改内容,它会改变代码的性能吗?我的意思是只是更改扩展名。声音的生成,以及我如何创建矢量,都是在 c++ 中完成的,效果很好。 没有。这样做没有性能问题,尽管从架构的角度来看,分离关注点总是一个好主意。您可能希望最终得到一个架构,即 C++ - Objective-C++ - Objective-C 三明治。

以上是关于从 c++ 通知 iOS 应用程序中的 UI的主要内容,如果未能解决你的问题,请参考以下文章

重定向以查看 IOS 通知栏中的点击推送消息

组织我的第一个 iOS 应用程序的 UI

iOS 测试推送通知的最佳实践(UI 测试)

如何更新通知徽章编号?

无法从 Facebook iOS 应用中的通知中获取 request_ids

从 iOS8 中的通知在后台启动呼叫