观察者工具类NotificationUtil

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

1.   .h文件

#ifndef _NotificationUtil_H_
#define _NotificationUtil_H_
#include "cocos2d.h"
using namespace cocos2d;
using namespace std;
class NotificationUtil : public Ref
{
public:
virtual bool init();
CREATE_FUNC(NotificationUtil);
static NotificationUtil * getInstance();//实现单例


//订阅消息
void addObserver(const std::string &sMsgName, std::function<void(Ref*)>func);


//发布消息
void postNotification(const std::string & sMsgName, Ref * data);
private:
static NotificationUtil * m_NotifiactionUtil;


std::map<std::string, std::vector<std::function<void(Ref*)>>> m_funcMap;


};
#endif

2.  .cpp

#include "NotificationUtil.h"
NotificationUtil * NotificationUtil::m_NotifiactionUtil = NULL;
bool NotificationUtil::init()
{
return true;
}


NotificationUtil * NotificationUtil::getInstance()
{
if (m_NotifiactionUtil == NULL)


{
m_NotifiactionUtil = NotificationUtil::create();
m_NotifiactionUtil->retain();
}
return m_NotifiactionUtil;
}


void NotificationUtil::addObserver(const std::string &sMsgName, std::function<void(Ref*)>func)
{
//查找是否有已经存在该消息的回调列表
if (m_funcMap.find(sMsgName)!=m_funcMap.end())
{
//已经存在该回调列表(换句话说,已经有人订阅过同样的消息)
std::vector<std::function<void(Ref*)>> & funcList = m_funcMap.at(sMsgName);


funcList.push_back(func);
}
else
{
//不存在该回调列表,表示没有人订阅过这种消息,新建一个列表
std::vector<std::function<void(Ref *)>> funcList;


//将新的订阅者添加到回调列表里
funcList.push_back(func);


//将新建的列表保存到map中


m_funcMap[sMsgName] = funcList;


}


}


void NotificationUtil::postNotification(const std::string & sMsgName, Ref * data)
{
//查找是否有人订阅过此消息
if (m_funcMap.find(sMsgName) != m_funcMap.end())
{
//获取回调列表
std::vector<std::function<void(Ref*)>> funcList = m_funcMap.at(sMsgName);
//遍历列表,回调函数,并保存数据
for (auto func:funcList)
{
func(data);
}
}
}