最近对委托、事件的订阅使用的太多,订阅与被订阅之间的绑定约束非常...麻烦,所以翻了下MVVMLight源码找出这段可以拿出来用的部分,详情见下:

  一.开发中遇到的问题:

  场景1:ClassA中存在事件OnDataChanged,在数据发生改变时调用OnDataChanged事件通知其订阅者ClassB做相应处理

  1. 实现过程一般分如下几种
  • ClassB中有ClassA的实例,然后订阅事件
  • ClassA是单例模式,可以直接在ClassB中订阅单例ClassA的实例事件
  • ClassA、ClassB的实例在一个共同的对象中,ClassB订阅ClassA的实例事件

  问题:发生订阅这件事儿永远都需要前提条件,订阅方与被订阅方必须直接接触到才可以实现该逻辑,这样在不需要订阅与被订阅的对象接触时就不好处理逻辑了

  场景2:A、B两个人合作,分别写订阅方逻辑、被订阅方逻辑

  实现过程中,会遇到如下问题:

  • B需要依赖A必须先写好订阅事件才可以开始自己的工作
  • 在A、B双方对事件的参数、命名等发生修改时必须及时通知对方并要求对方立即更正,否则无法实现编译、调试和运行

  

  二.MVVMLight中消息通知机制的对外实现

  • 框架下对所有对象提供单例Messenger工具类,任何需要订阅、被订阅(发送、接收事件消息)的对象都通过对Messenger进行调用实现
  • 避免了订阅方与被订阅方必须实例接触的问题了
  • 调用方式上,在发送和接收用如下参数定义方式实现
/// <summary>
/// 注册订阅事件
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="recipient">订阅实例</param>
/// <param name="token">发送与接收定义的key值</param>
/// <param name="action">订阅事件触发的action</param>
/// <param name="keepTargetAlive">持续控制实例存在,防止被回收清除</param>
public virtual void Register<TMessage>(object recipient,object token,Action<TMessage> action,bool keepTargetAlive = false)
/// <summary>
/// 被订阅方触发事件
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="message">参数数据</param>
/// <param name="token">key</param>
public virtual void Send<TMessage>(TMessage message, object token)

  例

public class Class1
{
public Class1()
{
MessageTool.Messenger.Default.Register<string>(this, "key", DataChangedHandle);
} //订阅触发事件
public void DataChangedHandle(string obj)
{
//dosomething
} /// <summary>
///对外通知事件消息
/// </summary>
public void SendMessage() {
MessageTool.Messenger.Default.Send("Message", "key");
}
}

  逻辑解释:

  • 订阅时传参的“Key”是发送与接收之间唯一的key值,它的类型是object类型,也就是说可以根据自身需求进行设置key值类型
  • Messenger其内部逻辑是在对Key值和传参类型进行比对,完全符合时才会调用订阅方实例的action
  • Messenger有多重重载,订阅时不设置key,对任何传参类型相同的调用都接收触发,详情找机会下次分享

  优点:避免订阅与被订阅的实例接触、事件参数命名发生改变时影响变小,最多触发不到,不会影响编译

   缺点:我看到的必须有传参,即使null也可以,但必须有

  

  下一节对这段源码拿出来看下什么情况,挖坑待填

  

  接上文:

MVVMLight消息通知实现机制详解(二)

    

  

MVVMLight消息通知实现机制详解(一)的更多相关文章

  1. MVVMLight消息通知实现机制详解(二)

    接上文 MVVMLight消息通知实现机制详解(一) 该工具的内部主要逻辑是以字典模式进行储存持有订阅对象设置的传入参数Type类型.Key值.Action.Target(订阅对象本身) 在发生订阅事 ...

  2. iOS的消息转发机制详解

    iOS开发过程中,有一类的错误会经常遇到,就是找不到所调用的方法,当然这类问题比较好解决,给当前对象或其父类对象添加该方法即可,使得编译器在编译时能正确找到该方法:或者,还有另外的方法,由于Objec ...

  3. epoll机制详解

    epoll机制详解 大牛的详解 epoll详解 什么是epoll? epoll是为处理大批量句柄而作了改进的poll, 是性能最好的多路I/O就绪通知方法; 只有三个系统调用: epoll_creat ...

  4. [转]JavaScript异步机制详解

    原文: https://www.jianshu.com/p/4ea4ee713ead --------------------------------------------------------- ...

  5. Android应用AsyncTask处理机制详解及源码分析

    1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机 ...

  6. ssion机制详解

    ssion机制详解   ref:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚sess ...

  7. 【转载】Android应用AsyncTask处理机制详解及源码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个 ...

  8. 浏览器 HTTP 协议缓存机制详解

    最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...

  9. Linux 内存机制详解宝典

    Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...

随机推荐

  1. 获取最新ADT下载地址的方法

    最近网络不给力,谷歌上不去,想下个最新的ADT插件也难,于是寻找方法,最后找到一个不错的方法,问题解决过程如下(别嫌我啰嗦啊). 网上有人分享过下载ADT插件的页面地址:install-adt.htm ...

  2. ubuntu安装nvidia驱动以及cuda教程

    最近尝试在ubuntu中安装nvidia的显卡驱动以及cuda.花了近三天时间,真的如网上所说错误百出,期间甚至重装了一次ubuntu系统,搞到怀疑人生,整个都是泪- -.最终经过百般“磨难”总算安装 ...

  3. Gym - 101550A(Artwork 倒序+并查集)

    题目: 思路: 1.对输入数据离线,先把所有的黑线都画出来,统计一下剩余的白色连通块的个数,dfs过程将一个连通块放到一个集合中. 2.倒着往前消去黑线,如果当前的块A是白块就看他的四周有没有白块:有 ...

  4. NumPy 学习笔记(四)

    NumPy 算术函数: 1.numpy.reciprocal(arr) 返回参数逐个元素的倒数 2.numpy.power(one, two) 将第一个输入数组中的元素作为底数,计算它与第二个输入数组 ...

  5. VMWare学习总结(1)——Centos7安装完毕后无法联网的解决方法

    在VmWare 上安装Centos7时,装好vmware后还是连不上网,通过查找资料原来是因为有线网卡没有激活,默认centos和redhat7都是不启用有线网卡的,要么手动开启,要么安装时直接启用! ...

  6. android从sdcard中读取bitmap

    String sdcard_path=Environment.getExternalStorageDirectory().getCanonicalPath(); String file_path=sd ...

  7. 9、Java并发性和多线程-线程安全与共享资源

    以下内容转自http://ifeve.com/thread-safety/: 允许被多个线程同时执行的代码称作线程安全的代码.线程安全的代码不包含竞态条件.当多个线程同时更新共享资源时会引发竞态条件. ...

  8. ZOJ 题目2859 Matrix Searching(二维RMQ)

    Matrix Searching Time Limit: 10 Seconds      Memory Limit: 32768 KB Given an n*n matrix A, whose ent ...

  9. 再次讨论javascript 中的this

    原文: http://www.jb51.net/article/77519.htm 核心总结: 1.不论函数在哪里被调用,只要没有指定调用方,则this都指向window.指定了调用方,就指向调用方. ...

  10. linux 运行tensorflow文件缺少_bz2问题及解决

    今天,终于把如何在linux服务器上运行tensorflow程序的问题解决: 1.首先要在服务器上python下安装tensorflow(要看好是在python2还是python3下安装,还要看好是C ...