1. 观察者模式
我们只需要对感兴趣的消息进行订阅,一旦有新的动态,就可以收到这些消息。
2. NotificationCenter 常用函数
(1)addObserver函数 (订阅消息)
void addObserver(Ref * target,SEL_CallFuncO selector,const std::string & name,Ref * sender)
根据指定的target,添加观察者.
Ref * target :要订阅消息的主体
SEL_CallFuncO selector :消息回调函数
std::string & name:消息名称
Ref * sender :要传递的数据
(2)removeObserver 函数 (取消订阅)
void removeObserver(Ref * target,const std::string & name)
根据指定的target 和 name 移除观察者.
Ref * target:取消订阅消息的主体
const std::string & name:消息名称
(3)postNotification函数(发布消息)
void postNotification(const std::string & name) 根据某个名字发送一个通知事件.
const std::string & name: 消息名称
void postNotification(const std::string & name,Ref * sender) 根据某个名字发送一个通知事件.
const std::string & name: 消息名称
Ref * sender: 要传输的数据
3. 具体的代码实现
发布消息的类
bool NotificationCenterTest::init(){
if(!Layer::init()){
return false;
}
//创建一个菜单,用于发布test消息
auto lableItem = MenuItemLabel::create(Label::createWithTTF("send msg","fonts/Marker Felt.ttf",26),CC_CALLBACK_1(NotificationCenterTest::sendMsg,this));
auto menu = Menu::create(lableItem,NULL);
this->addChild(menu);
return true;
}
void NotificationCenterTest::sendMsg(Ref* pSender){
//发布test消息
auto sData = String::create("NotificationCenterTest msg");
sData->retain();
NotificationCenter::getInstance()->postNotification("test",sData);
}
订阅消息,接收消息的类
bool NotificationCenterOther::init(){
if(!Layer::init()){
return false;
}
//订阅消息类型为test的消息,不传递数据
NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(NotificationCenterOther::testMsg),"test",NULL);
return true;
}
void NotificationCenterOther::testMsg(Ref* pSender){
auto msg = (String*)pSender;
log("testMsg: %s",msg->getCString());
}
如果addObserver和postNotification函数都传递了数据,并且不是同一个数据,那将无法发布消息。