RUMsgCenter.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "RUMsgCenter.h"
  2. #include "RUMsgSubscriber.h"
  3. NS_RU_BEGIN
  4. std::unordered_map<std::string, MsgCenter*> MsgCenter::_gMsgCenters;
  5. MsgCenter* MsgCenter::instance(std::string key4MsgCenter) {
  6. auto msgCenterGot = _gMsgCenters.find(key4MsgCenter);
  7. if (msgCenterGot == _gMsgCenters.end()) {
  8. MsgCenter* msgCenter = new MsgCenter();
  9. _gMsgCenters.emplace(key4MsgCenter, msgCenter);
  10. return msgCenter;
  11. }
  12. return msgCenterGot->second;
  13. }
  14. void MsgCenter::receiveMsg(Msg* msg)
  15. {
  16. kMsgTopic msgTopic = msg->getMsgTopic();
  17. int msgTopicId = (int)msgTopic;
  18. auto subscribersGot = _subscriberMap.find(msgTopicId);
  19. if (subscribersGot != _subscriberMap.end()) {
  20. std::list<MsgSubscriber*> subscribers = subscribersGot->second;
  21. for (MsgSubscriber* subscriber : subscribers) {
  22. subscriber->handleMsg(msg);
  23. }
  24. }
  25. }
  26. void MsgCenter::addSubscriber(kMsgTopic msgTopic, MsgSubscriber* msgSubscriber, int priority)
  27. {
  28. msgSubscriber->setPriority(msgTopic, priority);
  29. int msgTopicId = (int)msgTopic;
  30. if (_subscriberMap.find(msgTopicId) == _subscriberMap.end()) {
  31. std::list<MsgSubscriber*> subscribers;
  32. subscribers.push_back(msgSubscriber);
  33. _subscriberMap.emplace(msgTopicId, subscribers);
  34. }else{
  35. _subscriberMap[msgTopicId].push_back(msgSubscriber);
  36. _subscriberMap[msgTopicId].sort([=](MsgSubscriber* left,MsgSubscriber* right){
  37. return left->getPriority(msgTopic) < right->getPriority(msgTopic);
  38. });
  39. }
  40. }
  41. void MsgCenter::removeSubscriber(kMsgTopic msgTopic, MsgSubscriber* msgSubscriber)
  42. {
  43. int msgTopicId = (int)msgTopic;
  44. if (_subscriberMap.find(msgTopicId) == _subscriberMap.end()) {
  45. CCASSERT(false, "有问题");
  46. }else{
  47. _subscriberMap[msgTopicId].remove(msgSubscriber);
  48. }
  49. }
  50. NS_RU_END