跳到主要内容

NoticeManager

重要 注意 提醒

Coding Style wiki


NoticeManagerNoticeSystem 的静态通知管理器 (红点系统核心),负责通知条件 (NoticeCondition) 的注册与条件 ID 查询,并于数据变更时通过 Notify 依条件 ID 查找持有条件的 NoticeItem 进行刷新显示。

命名空间OxGKit.NoticeSystem
类型public static class NoticeManager
源码NoticeManager.cs
using OxGKit.NoticeSystem;

快速上手

using OxGKit.NoticeSystem;

// 1. 注册通知条件 (启动时注册一次)
NoticeManager.RegisterCondition<NewMailCond>();

// 2. NoticeItem 注册条件与数据 (通过条件 ID + 数据)
this.mailNoticeItem.RegisterNotice(new NoticeInfo(NewMailCond.id, this._mailBox));

// 3. 数据变更时,通知条件 ID 刷新红点显示
this._mailBox.unreadCount++;
NoticeManager.Notify(NewMailCond.id);

通用规则

条件 ID

  • 条件 ID 于 RegisterCondition 注册时自动分配 (以条件类型作为唯一键)。
  • 惯例上于条件类中定义静态属性 id,通过 GetConditionId 获取:
public class NewMailCond : NoticeCondition
{
public static int id { get { return NoticeManager.GetConditionId<NewMailCond>(); } }

public override bool ShowCondition(object data) { /* ... */ }
}

重要 必须RegisterCondition 注册条件,才能通过 GetConditionId 获取条件 ID (未注册时返回 0)。

通知刷新流程

  1. 数据状态变更。
  2. 调用 Notify 通知条件 ID。
  3. NoticeManager 依条件 ID 查找持有该条件的所有 NoticeItem。
  4. 各 NoticeItem 重新进行条件检查 (ShowCondition),任一条件符合则显示、皆不符合则隐藏。

提醒 Notify 过程会自动剔除已销毁 (Destroyed) 的 NoticeItem 注册,无需担心残留引用。


方法总览

方法说明
RegisterCondition注册通知条件 (自动分配条件 ID)。
GetConditionId获取通知条件 ID。
Notify数据变更时,依条件 ID 或 NoticeItem 通知刷新显示。

RegisterCondition

public static void RegisterCondition<TNoticeCondition>() where TNoticeCondition : NoticeCondition, new()

注册通知条件 (创建条件实例并自动分配条件 ID),支持于运行时动态新增条件。

NoticeManager.RegisterCondition<NewMailCond>();
NoticeManager.RegisterCondition<CoinInWalletCond>();

注意 重复注册同一条件会被忽略,并输出警告日志。

GetConditionId

public static int GetConditionId<TNoticeCondition>() where TNoticeCondition : NoticeCondition

获取通知条件的条件 ID。

int conditionId = NoticeManager.GetConditionId<NewMailCond>();

注意 条件尚未注册时返回 0,需先通过 RegisterCondition 进行注册。

Notify

// 单一条件 ID (non-alloc)
public static void Notify(int conditionId)

// 多个条件 ID
public static void Notify(params int[] conditionIds)

// 依 NoticeItem 通知 (自动收集其持有条件 ID 并剔除重复)
public static void Notify(params NoticeItem[] noticeItems)

数据变更时进行通知,将依条件 ID 查找持有条件的所有 NoticeItem 进行条件检查与刷新显示

  • 依条件 ID 通知:直接指定条件 ID (单一条件 ID 版本为 non-alloc,效率最好)。
  • 依 NoticeItem 通知:自动收集传入 NoticeItem 持有的条件 ID,剔除重复后再统一通知 (避免同条件重复刷新)。
// 数据变更
this._wallet.IncreaseCoin();

// 单一条件 ID (non-alloc)
NoticeManager.Notify(CoinInWalletCond.id);

// 多个条件 ID
NoticeManager.Notify(CoinInWalletCond.id, CoinIsEvenCond.id);

// 依 NoticeItem 通知
NoticeManager.Notify(this.walletNoticeItem, this.coinNoticeItem);

重要 数据变更后必须 Notify 相关条件 ID,红点显示才会刷新;若使用值类型 (Value Type) 数据,需先通过 NoticeItem.RenewNotice 更新数据快照再 Notify。

注意 Notify 传入未注册的条件 ID 时,会输出错误日志 (Error Notice Condition Cannot find)。