C ++中的通知中心

时间:2011-11-04 22:50:46

标签: c++ objective-c notifications nsnotificationcenter cocoa-design-patterns

使用iOS和Mac目标C框架编程一段时间后,我开始喜欢NSNotificationCenter和NSNotification类实现的通用通知模式。回到C ++,它一直是我大多数事情的首选语言,我发现自己试图复制这种模式,并且相信应该已经存在类似C ++类的通用实现,为它提供支持。

看起来这种模式在C ++中比在Objective C中更难实现,因为后者的动态性更强,但似乎远非不可能。我已经查看了升级库,因为它们通常很棒,很遗憾没有在那里找到我的运气。虽然boost :: bind,boost :: lamda,boost :: function看起来像是完成了大部分工作。我错过了明显的东西吗?是否存在任何可以轻松复制NSNotification / NSNotificationCenter行为的内容?

3 个答案:

答案 0 :(得分:2)

理论上你可以创建一个类,它有一个函数指针向量,可以在调用某个通知时调用 - 一个具有字典的类,其中对象是推送通知时要调用的函数的向量

答案 1 :(得分:2)

除了其他答案中提到的boost个包,另一个选项是poco::NotificationCenter

这个实现更接近Cocoa通知框架,正如Poco的documentation中具体讨论的那样:

  

NotificationCenter类基本上是C ++的实现   在Apple的Cocoa(或OpenStep)中找到的NSNotificationCenter类。

答案 2 :(得分:1)

按照@ anno的建议来查看boot :: signal,它在检查之后看起来像是一个可能的选项,尽管它正如预期的那样,不像目标C解决方案那样直截了当。通过boost::signal tutorial,我想我会解决手头问题最相关的方面。


创建通知发件人:

  

考虑一个简单的新闻传递服务,客户端连接到新闻提供商,然后在信息到达时向所有连接的客户端发送新闻。新闻传递服务可以这样构建:

class NewsItem { /* ... */ };
boost::signal<void (const NewsItem&)> deliverNews;

deliverNews的目标是通知观察者已生成NewsItem


可以按如下方式添加观察者(使用boost :: bind库):

  

希望接收新闻更新的客户只需要将可以接收新闻项的功能对象连接到deliverNews信号。例如,我们的应用程序中可能有一个专门用于新闻的特殊消息区域,例如:

struct NewsMessageArea : public MessageArea
{
public:
  // ...

  void displayNews(const NewsItem& news) const
  {
    messageText = news.text();
    update();
  }
};

// ...
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */);
// ...
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1));

为了解决从列表中删除已经解除分配的观察者的问题,boost :: signal提供了以下解决方案

  

但是,如果用户关闭新闻消息区域,则会破坏该消息   newsNews知道的newsMessageArea对象是什么?最有可能的是,a   将发生分段错误。但是,有了Boost.Signals需要   只允许NewsMessageArea跟踪,并涉及插槽   newsMessageArea将在newsMessageArea断开时断开连接   销毁。通过派生可以跟踪NewsMessageArea类   公开来自boost :: signals :: trackable类,例如:

struct NewsMessageArea : public MessageArea, public boost::signals::trackable
{
  // ...
};
  

此时使用可跟踪存在显着的限制   进行插槽连接的对象:使用构建的函数对象   理解Boost.Bind,这样指针或引用   将找到并跟踪传递给boost :: bind的可跟踪对象。