国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Cocos Creator之消息分發(fā)

2021-12-17 17:53 作者:unity小能手  | 我要投稿


本篇開(kāi)始介紹游戲業(yè)務(wù)架構(gòu)相關(guān)的內(nèi)容。在游戲業(yè)務(wù)層,所有需要隔離的系統(tǒng)和模塊間通信都可以通過(guò)消息分發(fā)解耦。例如網(wǎng)絡(luò)返回通知、數(shù)據(jù)更新同步到界面等。

消息分發(fā)基于觀(guān)察者模式設(shè)計(jì)。需要處理消息的地方向消息中心注冊(cè)監(jiān)聽(tīng)回調(diào),派發(fā)消息時(shí),調(diào)用消息中心的派發(fā)接口遍歷該消息的監(jiān)聽(tīng)隊(duì)列,調(diào)用對(duì)應(yīng)的回調(diào)方法。

先定義監(jiān)聽(tīng)回調(diào)類(lèi)型

/**

* 消息監(jiān)聽(tīng)回調(diào)方法

*/

export type NotifyListener = (src: any, data: any) => void;

通過(guò)key-value方式保存監(jiān)聽(tīng)隊(duì)列

1private static msg2listDict: Dictionary< string, Array > = new Dictionary< string, Array<NotifyListenerInfo> >();

接口定義

/**

* 添加多次監(jiān)聽(tīng)者,需要手動(dòng)移除

* @param msg

* @param listener

* @param target

*/

public static addListener(msg: string, listener: NotifyListener, target?: any): void {}

/**

* 添加單次監(jiān)聽(tīng)者,事件觸發(fā)后即移除

* @param msg

* @param listener

* @param target

*/

public static addOnceListener(msg: string, listener: NotifyListener, target?: any): void {}

/**

* 移除指定消息指定的監(jiān)聽(tīng)者

* @param msg

* @param listener

*/

public static removeMsgListener(msg: string, listener: NotifyListener): void {}

/**

* 移除指定消息所有監(jiān)聽(tīng)者

* @param msg

*/

public static removeMsgAllListeners(msg: string): void {}

/**

* 移除指定目標(biāo)對(duì)指定消息的監(jiān)聽(tīng)

* @param msg

* @param target

*/

public static removeTargetMsgListen(msg: string, target: any): void {}

/**

* 移除指定目標(biāo)所有消息監(jiān)聽(tīng)

* @param target

*/

public static removeTargetAllMsgListen(target: any): void {}

/**

* 派發(fā)消息

* @param msg

* @param src

* @param data

*/

public static notify(msg: string, src: any, data: any): void {}

在添加移除實(shí)現(xiàn)中,需要注意某消息可能正在派發(fā)。

對(duì)于一個(gè)消息新添加的監(jiān)聽(tīng)者,應(yīng)該在當(dāng)前隊(duì)列消息派發(fā)完后再派發(fā),因此,添加一個(gè)待添加隊(duì)列

1private static listener2add: Array<NotifyListenerInfo> = [];

在添加監(jiān)聽(tīng)者時(shí)做以下判斷

// 該消息正在派發(fā),放入待添加隊(duì)列

if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {

NotifyCenter.listener2add.push(info);

return;

}

同樣在移除監(jiān)聽(tīng)者時(shí),可能正在派發(fā)消息,避免對(duì)隊(duì)列的修改導(dǎo)致for循環(huán)異常,添加一個(gè)待移除隊(duì)列,派發(fā)消息時(shí),如果該監(jiān)聽(tīng)者在移除隊(duì)列則不派發(fā)。在消息派發(fā)完后再將其移出隊(duì)列

1private static listener2remove: Array<NotifyListenerInfo> = [];

在移除監(jiān)聽(tīng)者時(shí)做以下判斷

// 該消息正在派發(fā),放入待移除隊(duì)列

if (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) {

NotifyCenter.listener2remove.push(list[i]);

} else {

list.splice(i, 1);

}

派發(fā)消息時(shí)遍歷指定消息下的隊(duì)列

// 隊(duì)列不存在,不需要處理

let list = NotifyCenter.msg2listDict.get(msg);

if (!list) {

return;

}

// 標(biāo)記消息正在派發(fā),多個(gè)消息可能同時(shí)在派發(fā),同一消息可能標(biāo)記多次

NotifyCenter.notifyMsgs.push(msg);

// 處理消息派發(fā)

for (let i = 0, n = list.length; i < n; i++) {

NotifyCenter._dispatch(list[i], src, data, false);

}

派發(fā)消息時(shí)先判斷是否在移除隊(duì)列

// 在移除隊(duì)列,不派發(fā)

if (NotifyCenter.listener2remove.indexOf(info) >= 0) {

return;

}

當(dāng)前隊(duì)列派發(fā)完后檢查待添加隊(duì)列

// 處理待添加隊(duì)列派發(fā)

for (let i = 0, n = msg2add.length; i < n; i++) {

if (listener2add[i].msg == msg) {

NotifyCenter._dispatch(listener2add[i], src, data, true);

}

}

引入消息分發(fā)中心,隔離的系統(tǒng)、模塊間通過(guò)消息監(jiān)聽(tīng)和派發(fā)通信,避免互相引用耦合。

更多資源請(qǐng)點(diǎn)擊:https://bycwedu.vipwan.cn/promotion_channels/630597732


Cocos Creator之消息分發(fā)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
白玉县| 淮滨县| 黄龙县| 普兰店市| 北碚区| 巨野县| 台南市| 盐山县| 曲松县| 邵阳县| 乳源| 涿州市| 太仆寺旗| 双柏县| 五家渠市| 海阳市| 达州市| 蕉岭县| 长顺县| 隆化县| 格尔木市| 达日县| 静海县| 鹰潭市| 鹤岗市| 交城县| 金山区| 大邑县| 浙江省| 鄂尔多斯市| 高碑店市| 大竹县| 保山市| 金昌市| 汉沽区| 文水县| 清流县| 鲁甸县| 安新县| 潞城市| 海口市|