StrangeIOC中Signal类使用详解

2023-11-08

在讲解Signal类之前,先复习一下dispatch的用法。
1、View层调用自身的dispatch(view)告知绑定的Mediator层也调用自身的dispatch(mediator)
2、Mediator层的dispatch(mediator)通常绑定了两个方法,一个是写在mediator层中的方法(多半是获取数据将数据传给view层,view层再调用自身的方法),一个是在Context中绑定的Command事件,执行顺序是先执行绑定的事件,相关的事件执行完毕返回数据,然后再执行另一个方法(这里比较绕,下面有例子详解)。
3、执行绑定的Command事件,CommadEvent调用自身的方法,此时会调用服务层(Service)的方法,并且在Command自身中给service的dispatch(Service)绑定方法,用于service完成与外界的数据交互调用。
4、Service完成与外界交互,将数据传给CommandEvent。
5、CommandEvent调用之前Service中dispatch(Service)绑定的方法,将数据传给Mediator。
6、Mediator调用dispatch(Mediator)绑定的方法,拿到CommandEvent传过来的数据,调用view层相关方法。
是不是看完上面的步骤感觉头晕,接下来通过一个例子讲解。
现在View层需要一个List类型的数据,但是View不关心如何拿到数据,它只要告诉Mediator层即可。
在这里插入图片描述
1、于是,View用自己的dispatch发出了信号。
在这里插入图片描述
2、在Mediator层中,View的dispatch有绑定的方法,会通知Mediator执行自己dispatch绑定的事件,并且拿到数据之后执行view层的方法。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
需要注意的是,Service也是需要在Context中绑定的
在这里插入图片描述
Service拿到数据后通过dispatch的方法传给CommandEvent,CommandEvent再调用自身的dispatch传给Mediator,Mediator拿到数据执行dispatch绑定的view的方法。
在这里插入图片描述
举一个不恰当的例子,可以将StrangeIOC理解为寻物接力跑,View把接力棒(dispatch)交给Mediator,Mediator再交给CommandEvent,CommandEvent再交给Service,Service拿到接力棒后开始寻找物体,找到之后再往回跑交给CommandEvent,CommandEvent再给Mediator,最后交到View手中。

复习完之前的内容,现在我们来讲解一下Signal类的用法。
首先第一步,先在Context文件中拷贝以下代码,解除原有的IDispatcher用法,绑定新的signal用法

    protected override void addCoreComponents()
    {
        base.addCoreComponents();
        injectionBinder.Unbind<ICommandBinder>();
        injectionBinder.Bind<ICommandBinder>().To<SignalCommandBinder>().ToSingleton();
    }

实现一个简单的需求,和原来一样,view层发出一个信号,然后拿到数据进行相应的操作,至于如何拿到数据不管,交给其他几个层解决。
view层代码:

public class Demo1View : View {
    public Signal RequestSolutionSignal = new Signal();
    public void Init()
    {
        RequestSolutionSignal.Dispatch();
    }
    public void Load()
    {
        Debug.Log("数据已拿到,准备开始加载");
    }    
}

mediator层代码:

public class Demo1Mediator : Mediator {
    [Inject]
    public Demo1View demo1View { get; set; }
    [Inject]
    public RequestSolutionData requestSolutionData { get; set; }
    [Inject]
    public ResponseSolutionData loadSolutionData { get; set; }
    public override void OnRegister()
    {
        demo1View.RequestSolutionSignal.AddListener(() => requestSolutionData.Dispatch());
        loadSolutionData.AddListener(demo1View.Load);
        demo1View.Init();
    }
}

server层代码

public interface IServices  {
    void LoadData(Action action);
}
public class Services : IServices
{
    public void LoadData(Action action)
    {
        DataHelper.data = "通过signal信号调用了server层";
        Debug.Log("server层已经拿到数据");
        action();
    }
}

Controller层代码:

public class RequestItemsCommand :Command
{
    [Inject]
    public IServices services { get; set; }
    [Inject]
    public ResponseSolutionData loadSolutionData { get; set; }

    public override void Execute()
    {
        Retain();
        services.LoadData(loadSolutionData.Dispatch);
    }
}

Signal类:只负责声明信号,不负责实现

//请求远端数据
public class RequestSolutionData : Signal { }

//订单数据加载完成,之后开始加载
public class ResponseSolutionData : Signal { }

与Dispatcher用法比起来,Signal类用起来更自由,首先他是根据每一个信号来调用相关方法,不像Disptacher方法是枚举或者字符串,Signal只需要声明一个新的signal继承signal即可。
拿上述demo举例。
view层有一个signal。用来传递获取数据的信息。(即告诉mediator,喂,我要数据)
mediator层,有两个signal,一个signal用来与controller层交互,即当view发出要消息的signal时,调用自身的与controller交互的signal让controller去获取数据。另一个signal通知view层,我拿到数据啦,你可以执行相应的方法了。
在这里插入图片描述
Controller层有一个signal,Controller接收到信号后,会调用自己的server相对应的方法,完成后调用signal,告诉mediator我拿到数据了,你可以执行相关的方法了。
在这里插入图片描述
在这里插入图片描述
如果想传递参数,对相应的signal做调整即可。
View层:
在这里插入图片描述
Mediator层:
在这里插入图片描述
声明的Signal做出改变:
在这里插入图片描述
controller添加对应的参数。
在这里插入图片描述
server层方法也添加相应的参数。
在这里插入图片描述
在这里插入图片描述

测试。

在这里插入图片描述

至此。Signal类的简单用法就总结的差不多了,因为工作中拿到接口是对静态变量赋值(很多地方都会用到这个变量),这里演示也是用静态变量,如果想对参数赋值,也可以参考传参的方式自己写一下。
注意点:Mediator要注意各个signal绑定的顺序,不要出现先执行后绑定的情况。调用view层的signal需要单独绑定并实现(即Mediator层和Controller都有的signal)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不然会报错。在这里插入图片描述

总结的可能有点绕,确实是第一次接触框架,自身硬实力不够,用法也是依葫芦画瓢,希望有一天自己可以成长到能看懂底层代码。
案例Demo(Demo是包含传参的,如果不需要,参照上面代码修改,或者直接删除所有参数即可)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StrangeIOC中Signal类使用详解 的相关文章

  • Unity3D 地形(Terrain)设置

    这篇说的是Unity地形 关于Unity3D是什么 我就不多做解释了 由于工作原因 该系列原创教程不定期更新 每月必然有更新 谢谢各位 Unity地形 新建地形 如图在菜单中新建一个地形 就会在 中看到Terrain对象 如果要修改地形参数
  • 关于Albedo贴图、颜色贴图、Metallic 贴图、Specular贴图、法线贴图、视差贴图、凹凸贴图、Height Map高度贴图、AO 贴图Occlusion 贴图、Emission 贴图等

    在学习unity的过程中 被各种贴图弄得晕头转向 为了弄清楚各种贴图 查询了很多资料 粗略的整理如下 只要耐心看完 对贴图的基本用法基本上就没问题了 1 Albedo 贴图 可以看做是Diffuse颜色贴图 Albedo 反照率 贴图 用于
  • VS2017调试unity没有解决方案

    1 VS2017之前的版本调试unity 需要下载 Visual Studio Tools for Unity 2 VS2017内置了Visual Studio Tools for Unity 3 首先打开 帮助 gt 关于 已安装程序中查
  • URP——后期处理特效

    通用渲染管道 URP 包括一个后处理效果的集成实现 如果使用URP 则不需要为后期处理效果安装额外的包 URP与Post Processing Stack v2包不兼容 URP使用体积框架进行后期处理效果 下面的图片显示了一个URP场景有没
  • unity多个贴图shader

    在一个Material上放多个贴图的测试 比如一个plane上放四个贴图 Shader aaa Properties MainTex Texture 2D white MainTex2 Texture 2D white MainTex3 T
  • Unity3d中使用OnGUI()函数判断“键盘按下抬起”功能的新方法。

    private bool flagJudgeDownAllow true 开始值为true void OnGUI key Event current FunctionKeyCodeV1 key private void FunctionKe
  • Unity3D中通过代码修改子物体层级的顺序

    今天有个同事问我如何在程序中修改子物体的层级关系来改变遮挡关系 我给他敲出来一句代码 UI的层级关系是通过渲染表现出来的 在canvas下的物体 排序越靠前的越先被渲染 这样一来就会 被后来渲染的遮挡 总结一下有三句代码是修改子物体的层级的
  • Unity_场景之间的跳转

    跳转场景之前 需要在 File gt Build Settings gt Add Open Scenes 或者 直接把 场景 拖拽进来 跳转场景方法1 已过时 跳转场景方法 public void OnStartGame string Sc
  • 服务器时间管理器

    时间戳管理器 using System using UnityEngine public class SyncTime Singleton
  • 《Unity Shader入门精要》彩图版免费分享~~~~~

    这书很多地方都要币或者要钱 这里就免费分享了 下面是网盘链接 顺手点个赞或者评论一波呗 下载链接 链接 https pan baidu com s 137Y1nkB6h8HIvKOfwFPnbQ 提取码 f8dw 顺手点个赞 蟹蟹蟹蟹
  • Vuforia Virtual Button(虚拟按钮)使用技巧

    最近一直在摸索Vuforia的使用 Virtual Button算是一个比较容易吸引人眼球的功能 在经过一些测试后 我来总结下自己在探索过程中得到的一些经验 1 如何新建一个Virtual Button工程 导入Vuforia sdk 后把
  • Unity+Pico 手柄按键控制

    一 定义手柄按键API 1 InputDevices GetDeviceAtXRNode 通过XRNode获取对应的设备 2 XRNode是一个枚举类型 包含LeftEye RightEye CenterEye Head LeftHand
  • untiy的纹理格式介绍

    Desktop RGB Compressed DXT1 压缩的RGB纹理 这是最常见的漫反射纹理格式 4位 像素 32 KB 256x256 RGBA Compressed DXT5 压缩的RGBA纹理 这是漫反射和高光控制纹理的主要格式
  • unity本地分数排行榜简单解决方案(Json)

    具体效果 大体方法 创建一个分数类Score和一个分数类的容器List
  • Unity里清除Console控制台Log的函数

    Log输出部分转发来自 http blog sina com cn s blog 13c4bf4b40102wz0r html 在控制台输出中 是开发者常用到的一种函数 通过Debug类来实现 打印字符串 Debug Log log 如果有
  • Input.GetAxis _ Unity3d

    Input GetAxis 获取轴 static function GetAxis axisName string float Description描述 Returns the value of the virtual axis iden
  • [3dsMax]2018版下拉菜单项的子菜单无法选中

    软件自身问题 安装更新补丁即可解决 不想更新补丁也可以使用键盘的方向键进行选中 补丁百度云链接 https pan baidu com s 1LDxRFwQnR0GSONuz7wcEfA 提取码 6gpk
  • Unity3D:按键生成物件,Instantia…

    在按下按键之后 可以在画面中生成之前定义好了的物体 这里使用了Instantiate函数来生成 1 先在游戏中定一个空物件GameObject 创建空物件快捷键 ctrl shift n 2 在视图中放置 3 编写脚本 脚本 SpaceCh
  • Unity3d获得android和ios设备的唯一标识

    android为mac地址 ios为advertisingIdentifier 函数都比较简单 网上也搜得到 我也就不多说了 主要是对于我们没做过安卓和IOS开发的人来说 整合进工程有各种的问题 我也就直接上网盘了点击打开链接 代码包里看得
  • Unity3d中脚本无法编译问题(Monodevelop)

    使用Monodevelop打开脚本 编译时报错 具体错误忘记了 原因是 net框架引起 升级到 net框架4 5后解决

随机推荐

  • 计算机怎么盲打键盘,如何练习盲打 键盘盲打指法练习技巧-电脑教程

    很多人在电脑上打字都还需要看着键盘 不会盲打 看到电脑高手噼里啪啦的打字速度着实令人羡慕 很多小白朋友所自己笨 不会盲打 其实不会盲打并不是因为笨 而是没找到一种简单易行的练习方法 按照标准指法 看着键盘按照从A到Z的顺序打26个字母 最多
  • Mysql多对多关系,分组拼接把多个数据查询到一条数据上

    GROUP CONCAT str 分组字符串拼接 与分组一起使用 案例 查询企业信息以及企业分类信息 其中企业分类信息和企业是多对多的关系 按普通的联表查询 我们会查询到一条企业信息对应多个企业分类 会出现多个记录 如果想实现把同一个企业的
  • 全面理解java中的构造方法以及this关键字的用法(超详细)

    Hello 各位铁汁们 我是小 儿哈 今天我又来更新我的Java基础学习博客了 本篇主要内容概述 1 如何用构造方法初始化对象 2 为啥要有this这个关键字 3 this 属性名访问成员变量 成员方法 4 this 方法名 this 的用
  • Pandas进阶筛选和取数操作

    总结了pandas各种进阶操作与使用技巧 并且对各方法间的效率进行比较 创建一个pandas的dataframe对象作为下文样例 import pandas as pd import numpy as np df pd DataFrame
  • 陀螺研究院:《2019年分布式金融商业趋势及落地情况分析报告》

    2018年末开始 以DeFi为代表的分布式金融 在业内引起了广泛的讨论 传统的金融模式以中央银行 商业银行 非银金融机构为核心展开支付 借贷 保险等场景内的应用 但DeFi彻底摆脱了原有的核心 以分布式账本作为清算依据 从而降低了金融服务中
  • 前馈全连接神经网络和函数逼近、时间序列预测、手写数字识别

    https www cnblogs com conmajia p annt feed forward fully connected neural networks html 前馈全连接神经网络和函数逼近 时间序列预测 手写数字识别 And
  • springboot中JDBC连接超时问题

    最近项目中有一个问题 电子保卡信息要写入数据库 但写入失败 报错 息是这样的 The last packet successfully received from the server was 57 704 088 milliseconds
  • Stream流

    Stream流 Stream 流 是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象 形成一个队列 Java中的Stream并不会存储元素 而 是按需计算 数据源 流的来源 可以是集合 数组等 聚合操作 类似SQL语句一样的操作
  • Bes 充电盒协议总结

    1 开盖 上升沿信号开机 a 充电脚设成3 0 v 然后延迟160ms b 充电脚设成5v 然后延时100 ms c充电脚设成3 0 v 2 合盖 a 开5v 然后延时3s b 关5v 然后延时45ms c 发送复位pattern 0101
  • c++ 字符串相等比较

    介绍 在C 中比较字符串的技术 Techniques to Compare Strings in C Strings in C can be compared using either of the following techniques
  • mysql命令 show_mysql--SHOW命令大全

    SHOW AUTHORS 顾名思义 这个要展示的是各位MYSQL开发者的信息 包括姓名 住址及相关注解 e g 1 mysql gt show authors G 1 row Name Brian Krow Aker Location Se
  • LeetCode 62. Unique Paths

    题目链接 题目描述 A robot is located at the top left corner of a m x n grid marked Start in the diagram below The robot can only
  • Microsoft Store无法打开解决方案 错误代码:0x80131500

    这种情况大部分是设置了Vpn代理 提供两种解决方案 一 打开 运行 输入 inetcpl cpl 点还原高级设置 注意看看勾选了TLS 1 2没有 二 如果上述方法没有解决 那么就打开Internet选项 gt 安全选项卡 gt 点一下 将
  • pip安装opencv-python

    文章目录 前言 一 基本概念 二 操作步骤 1 删除旧版本 2 pip升级 3 opencv python安装 总结 前言 OpenCV的全称是Open Source Computer Vision Library 是一个跨平台的计算机视觉
  • 跳转至tabBar页面不触发页面的onLoad,点击底部tabar不触发onLoad

    小程序想跳转tabar页面带参数 使用了全局变量app js的全局 跳转到页面后发现不是每次都执行onLoad方法 传参失败 更换跳转的方法解决 由wx switchTab改为wx reLaunch 就可以了 点击底部导航不触发解决 js
  • Ubuntu挂载Win10下的NTFS硬盘出错的解决方案

    概述 在Ubuntu下打开Win10的NTFS硬盘总是提示出错了 而且是全部的NTFS盘都出错 其中sdb1错误显示如下 he disk contains an unclean file system 0 0 Metadata kept i
  • matplotlib函数总结

    导入matplotlib import matplotlib pyplot as plt import matplotlib Figures对象包含一个或多个Asex对象 方法 matplotlib rc figure figsize 14
  • 在Ubuntu18.04.3系统中安装谷歌拼音输入法(Google Pinyin)

    一 安装前的准备 在Ubuntu18 04下 谷歌拼音输入法是基于Fcitx输入法的 因此 我们需要首先安装Fcitx 一般来说 Ubuntu最新版中都默认安装了Fcitx 但是为了确保一下 我们可以在系统终端中运行如下命令 sudo ap
  • 如何用PHP解决高并发与大流量问题

    举个例子 高速路口 1秒钟来5部车 每秒通过5部车 高速路口运作正常 突然 这个路口1秒钟只能通过4部车 车流量仍然依旧 结果必定出现大塞车 5条车道忽然变成4条车道的感觉 同理 某一个秒内 20 500个可用连接进程都在满负荷工作中 却仍
  • StrangeIOC中Signal类使用详解

    在讲解Signal类之前 先复习一下dispatch的用法 1 View层调用自身的dispatch view 告知绑定的Mediator层也调用自身的dispatch mediator 2 Mediator层的dispatch media