为何MessagingCenter订阅处理函数在参数对象不同时仍被触发?
为什么MessagingCenter订阅处理函数会被触发?
这事儿其实是因为MessagingCenter的触发逻辑和你回调里的对象相等性判断是完全两个阶段的操作,咱们一步步拆解清楚:
MessagingCenter的触发规则是什么?
MessagingCenter只看三个匹配维度,只要都对上就会触发回调:- 消息名称(你这里的
"AppointmentLoaded") - 泛型参数的类型(也就是
<object, AppointmentDetail>这个组合) - 订阅时指定的接收者实例(你代码里的
this,也就是当前页面)
它根本不关心你传递的AppointmentDetail对象和页面成员的appointment是不是同一个——只要Send调用满足上面三个条件,回调就一定会被触发。你写的if (appointment.AppointmentId == a.AppointmentId && appointment != a)是回调触发之后才执行的业务判断,它管的是回调里的逻辑要不要跑,而不是回调会不会被调用。
- 消息名称(你这里的
你的代码场景刚好命中触发条件
你在同一页面调用MessagingCenter.Send<object, AppointmentDetail>(this, "AppointmentLoaded", appointment);,完全符合订阅时的三个匹配要求:- 消息名完全一致
- 泛型类型和订阅时的声明完全匹配
- 发送者和订阅接收者都是当前页面的
this实例
所以回调必然会被触发,至于里面的if分支,只是决定后续业务代码是否执行,但回调本身已经被调用了。
要是想减少不必要的回调怎么办?
MessagingCenter本身是基于消息名和类型的广播机制,没法提前过滤对象条件。你要么继续在回调里做判断,要么换用更精准的事件方式(比如直接给特定对象绑定事件委托,只在目标对象变更时触发)。
内容的提问来源于stack exchange,提问作者Ian Warburton
相关产品推荐
相关产品推荐

