• cocos2d-x 3.2线程安全的消息中心


    本文章参考了某个博友的文章,具体的记不清楚了,望见谅!
    //
    //  MsgManager.h
    //  MsgManager
    //
    //  Created by sky on 14-11-21.
    //
    //  线程安全的消息中心

    #ifndef __MsgManager__MsgManager__
    #define __MsgManager__MsgManager__

    #include <stdio.h>
    #include
     "cocos2d.h"
    USING_NS_CC;

    //消息体
    class CC_DLL Message :public Ref
    {
    public:
        Message(
    const std::string &msgName,Ref* target,SEL_CallFuncO selector,Ref* msgContent);
       
     virtual ~Message();
       
     void handerMessage(Ref*msgContent);
       
     CC_SYNTHESIZE_READONLY(std::string, m_msgName, MessageName);
       
     CC_SYNTHESIZE_READONLY(Ref*, m_target, Target);
       
     CC_SYNTHESIZE_READONLY(SEL_CallFuncO, m_selector, Selector);
       
     CC_SYNTHESIZE_READONLY(Ref*, m_msgContent, MessageContent); //function args
    };


    //消息管理
    classCC_DLL MsgManager:publicRef
    {
    public:
        MsgManager();
       
       
     virtual ~MsgManager();
       
       
     staticMsgManager* getInstance();
       
       
     //多个对象可以监听同一个名字的消息
       
     bool addObserver(conststd::string &msgName,Ref*target,SEL_CallFuncO selector,Ref* msgContent=nullptr);
       
       
     void postMessage(conststd::string& msgName);

       
     void postMessage(conststd::string& msgName,Ref*msgContent);
       
       
     //如果target为空则移除所有名字为msgName的消息
       
     void removeObserverByName(conststd::string& msgName,Ref*target=nullptr);
       
       
     //移除一个对象的所有监听
       
     void removeAllObserver(Ref* target);
       
    protected:
       
     Message* getMessageByNameAndTarget(conststd::string &msgName,Ref* target) const;

    private:
       
     Vector<Message*> m_msgContainer;
    };


    #endif /* defined(__MsgManager__MsgManager__) */


    //
    //  MsgManager.cpp
    //  MsgManager
    //
    //  Created by sky on 14-11-21.
    //
    //

    #include "MsgManager.h"

    #pragma mark--消息体
    Message::Message(const std::string &msgName,Ref* target,SEL_CallFuncO selector,Ref* msgContent):m_msgName(msgName),
                    m_target(target),
                    m_selector(selector),
                    m_msgContent(msgContent)
                   
    {
    }
    Message::~Message()
    {
    }

    void Message::handerMessage(cocos2d::Ref *msgContent)
    {
       
     if (m_target)
        {
            (m_target ->* m_selector)(msgContent);
        }
    }

    #pragma mark--消息管理
    static MsgManager* instance = nullptr;
    std::mutex containerMutex;

    MsgManager::MsgManager()
    {
    }
    MsgManager::~MsgManager()
    {
        m_msgContainer.clear();
    }

    MsgManager* MsgManager::getInstance()
    {
       
     if (!instance)
        {
            instance =
     new MsgManager();
        }
       
     return instance;
    }

    bool MsgManager::addObserver(const std::string &msgName, cocos2d::Ref *target, SEL_CallFuncO selector,Ref *msgContent)
    {
        std::lock_guard<std::mutex> ul(containerMutex);

       
     if (!getMessageByNameAndTarget(msgName,target))
        {
           
     auto msg = new Message(msgName,target,selector,msgContent);
           
     if (!msg)
            {
               
     returnfalse;
                CC_SAFE_DELETE(msg);
            }
            msg -> autorelease();
            m_msgContainer.pushBack(msg);
            CCLOG(
    "msgCount:%lu",m_msgContainer.size());
           
           
     return true;
        }
       
     return false;
    }

    void MsgManager::postMessage(const std::string &msgName, cocos2d::Ref *msgContent)
    {
        std::lock_guard<std::mutex> ul(containerMutex);
       
     for(auto &msg : m_msgContainer)
        {
           
     if (msgName==msg->getMessageName())
            {
                msg -> handerMessage(msgContent);
            }
        }
    }

    void MsgManager::postMessage(const std::string &msgName)
    {
        postMessage(msgName,
    nullptr);
    }

    Message* MsgManager::getMessageByNameAndTarget(
    const std::string &msgName, cocos2d::Ref *target) const
    {
       
     for(auto &msg : m_msgContainer)
        {
           
     if (msgName==msg->getMessageName() && target==msg->getTarget())
            {
               
     return msg;
            }
        }
       
     return nullptr;
    }

    void MsgManager::removeObserverByName(const std::string &msgName,Ref *target)
    {
        std::lock_guard<std::mutex> ui(containerMutex);
       
     for(auto &msg : m_msgContainer)
        {
           
     if (msgName == msg->getMessageName() && (target==msg->getTarget()||!target))
            {
                m_msgContainer.eraseObject(msg,
    true);  //?
            }
        }
    }

    void MsgManager::removeAllObserver(cocos2d::Ref *target)
    {
        std::lock_guard<std::mutex> ul(containerMutex);
       
     for (auto &msg : m_msgContainer)
        {
           
     if (target==msg->getTarget())
            {
                m_msgContainer.eraseObject(msg,
    true);
            }
        }
    }

  • 相关阅读:
    在 Laravel 5.1 中使用 Pjax
    在 iOS 中实现方法链调用
    利用 WireShark 深入调试网络请求
    设计一个健壮的后台下载
    设计一个健壮的大型文件下载系统
    iOS开发基础知识:Core Animation(核心动画)
    开发 Swift 和 Objective-C 混编的 Framework
    protobuf3 iOS 接入 protobuf
    iOS之ProtocolBuffer搭建
    iOS10 推送必看(基础篇)
  • 原文地址:https://www.cnblogs.com/skyxu123/p/9543819.html
Copyright © 2020-2023  润新知