类NoticeCenter,是全局的一个事件订阅分发的松耦合机制。通过一个静态的 instance函数,获取全局的NoticeCenter对象,进行addListener ,emitEvent等主要接口的调用。
EventDispatcher中的主要成员变量
typedef unordered_multimap<void *, std::shared_ptr<void> > MapType;
MapType _mapListener;
_mapListener记录 事件标志和回调的 multimap
class NoticeCenter : public std::enable_shared_from_this<NoticeCenter> {
public:
typedef std::shared_ptr<NoticeCenter> Ptr;
~NoticeCenter() {}
static NoticeCenter &Instance();
//事件发送
template<typename ...ArgsType>
int emitEvent(const string &strEvent, ArgsType &&...args) {
auto dispatcher = getDispatcher(strEvent);
if (!dispatcher) {
//该事件无人监听
return 0;
}
return dispatcher->emitEvent(std::forward<ArgsType>(args)...);
}
//事件类型监听订阅
template<typename FUNC>
void addListener(void *tag, const string &event, FUNC &&func) {
getDispatcher(event, true)->addListener(tag, std::forward<FUNC>(func));
}
//取消事件类型订阅
void delListener(void *tag, const string &event) {
auto dispatcher = getDispatcher(event);
if (!dispatcher) {
//不存在该事件
return;
}
bool empty;
dispatcher->delListener(tag, empty);
if (empty) {
delDispatcher(event, dispatcher);
}
}
//这个方法性能比较差
void delListener(void *tag) {
lock_guard<recursive_mutex> lck(_mtxListener);
bool empty;
for (auto it = _mapListener.begin(); it != _mapListener.end();) {
it->second->delListener(tag, empty);
if (empty) {
it = _mapListener.erase(it);
continue;
}
++it;
}
}
void clearAll() {
lock_guard<recursive_mutex> lck(_mtxListener);
_mapListener.clear();
}
private:
EventDispatcher::Ptr getDispatcher(const string &event, bool create = false) {
lock_guard<recursive_mutex> lck(_mtxListener);
auto it = _mapListener.find(event);
if (it != _mapListener.end()) {
return it->second;
}
if (create) {
//如果为空则创建一个
EventDispatcher::Ptr dispatcher(new EventDispatcher());
_mapListener.emplace(event, dispatcher);
return dispatcher;
}
return nullptr;
}
void delDispatcher(const string &event, const EventDispatcher::Ptr &dispatcher) {
lock_guard<recursive_mutex> lck(_mtxListener);
auto it = _mapListener.find(event);
if (it != _mapListener.end() && dispatcher == it->second) {
//两者相同则删除
_mapListener.erase(it);
}
}
NoticeCenter() {}
private:
recursive_mutex _mtxListener;
unordered_map<string, EventDispatcher::Ptr> _mapListener;
};