威尼斯人线上娱乐

观望者格局,委托和事件

2 4月 , 2019  

本节对事件进展总括。

缘何选拔ReactiveCocoa

原稿发表时间为:2009-1一-0一 —— 来源于本身的百度小说 [由搬家工具导入]

委托和事件的一对基础知识可参见 C#/.NET 基础学习 之 [委托-事件]
部分;

二、事件:

1、开发进度中,状态及气象之间信赖过多,状态变化很难跟踪,令人胸闷,RAC能越发实用处监护人件流,而无需去管理情况。

一、委托的注解:

参考
[1]. 初识事件 到
自定义事件;
[威尼斯人线上娱乐,2]. 从类型不安全的嘱托 到
类型安全的风浪;
[3]. 函数指针 ~
C#中的委托(Delegate)和事件(伊芙nt);
[4]. C# 中的委托和事件 –
张子阳;
   C# 中的委托和事件(续) –
张子阳;

一、概念:伊夫nt:A member that enables an object or class to provide notifications;官方的诠释是这么,正是说在C#中,事件是使

贰、减弱方法的调用,由于它跟踪状态和值的浮动,由此不供给状态更新时手动调用,收缩失误的可能。

<access modifier> delegate <returnType> HandlerName
([parameters])


指标只怕类具有通告能力的积极分子。比如说手提式有线电话机接到短信提醒小编去开会,那么手提式有线电话机就担任了2个存有公告能力的分子。说白了,事件

3、提供统一的新闻传递方法,将文告、代理、kvo以及任何全数UIControl事件的浮动都进展监察,当发生变化时,就会传送事件和值。

例如:

委托

 委托本质是三个密封类,定义方法的品种,将艺术作为艺术的参数。委托包括2个有着同等签名和重返值类型的平稳的主意列表(调用列表)。
 委托注脚:public delegate void MyDel(string str);
编译结果为:

public sealed class MyDel : System.MulticastDelegate
{
   public MyDel(object @object, IntPtr method);
   public virtual void Invoke(string str);
   public virtual void EndInvoke(IAsyncResult res);
   public virtual IAsyncResult BeginInvoke(string str, AsyncCallback callback, object @object);
}

推而广之:自定义委托类 MyDel 继承于类
MulticastDelegate,MulticastDelegate 类是 System.Delegate
的子类,辅助多路广播委托并维护对应的委托列表。多个常用 public 属性:
 · Target:委托调用的章程所属的类实例的引用,若方法是静态方法,则为
null;
 · Method:委托所代表的形式的音讯;
  构造函数中的参数:object 为目的实例的引用,methodPtr
用于标识回调方法,分别对应 Target 和 Method。一个常用 public 方法:
 · public Delegate[]
GetInvocationList();委托的调用列表中方法的数组;
参考:C# –
委托链;信托的本质论; 

的功力正是指标和类之间的音信传递的大桥。

四、当值随着事件变化时,能够运用combineLatest、map、filter等函数便利地对值进行转变操作。

public delegate void PrintHandler(string str);

1. 创建委托(对象)

 [修饰符] delegate 返回值类型 MyDel(参数列表);
 MyDel objDel1 = new MyDel(obj.实例方法);   或 MyDel objDel1 = obj.实例方法;
 MyDel objDel2 = new MyDel(Class.静态方法); 或 MyDel objDel2 = Class.静态方法;

  · 为委托对象分配内部存款和储蓄器;
  · 把办法添加到委托对象的调用列表中;

二、原理:源于发生-响应模型:

五、事件的处理及监听能够置身一起,符合高内聚、低耦合的合计

     
委托注明定义了壹种类型,它用一组特定的参数以及再次来到类型来封装方法。对于静态方法,委托对象封装要调用的法门。对于实例方法,委托对象同时包装一个实例和该实例上的2个主意。假使你有多个委托对象和①组适当的参数,则能够用那一个参数调用该信托。

2. 组合委托 (Combining Delegate)

 委托是原则性的,委托对象被创设后就不会再被转移。委托组合拷贝的是操作数的副本,只有相同档次的委托才可以整合。委托的咬合和移除分别用”+”和”-“;

  MyDel objDel = objDel1 + objDel2; 

事件源(event source) + 事件自己(event) => 事件的订阅者(event subscriber) + 事件处理器(event handler)           

RAC的编制程序思想

在C#中应用委托方法:

3. 调用委托

 objDel(参数列表); 或 objDel.Invoke(参数列表); 

  用于调用委托的参数会去调用调用列表中的各个方法。
  · 调用带重返值的嘱托:委托调用的重回值是其调用列表中最终三个主意的再次回到值。
  观望者格局,委托和事件。· 调用带引用参数的嘱托:调用委托的参数会趁机调用列表中方法的调用而变更。
 :Invoke
是联合署名方法,BeginInvoke/EndInvoke 是异步方法,但其调用者 myDel
的调用列表有且不得不用多个格局,而 Invoke 未有这些限制。Invoke and
BeginInvoke
介绍;

 IAsyncResult res = myDel.BeginInvoke(委托的参数列表, null, null);            
 myDel.EndInvoke(res);

(别的还有事件的订阅者和事件源之间的订阅关系subscribe relationship)

面向进度:以处总管件的历程为骨干,一步一步完毕。

·         
成立委托所选取的法子必须和信托表明相平等(参数列表、再次回到值都一样)

4. 匿名委托

  匿名委托能够访问其所在措施的片段变量,具体 .Net委托和事件 –
匿名委托部分;
 

抑或以手提式有线话机收到短信提示自身去开会为例,事件源:手提式有线电话机啊,事件:收到短信,事件的订阅者:笔者,事件处理器:去开会,订阅关系:小编订阅手提式有线电话机

面向对象:万物皆对象

·          利用
+=、-=来开始展览委托的链接、裁撤链接或直接利用Delegate.Combine和Delegate.Remove方法来促成

5. Action<> 和 Func<> 以及 Predicate<>

 
将委托的注脚和赋值合并,进一步简化。Action<>未有重返值,Func<>有再次来到值。

  // 委托的几种赋值方法均可用在此处
  Func<int,bool> myDel = (Lambda表达式);
  Func<int,bool> myDel = new Func<int,bool>(函数名);

  Predicate<T> 是再次回到 bool 的泛型委托,能够领略为
Func<T,bool>的泛型委托的别称,多用来查询的尺度表明式。
 
 参考
 [1]. 从委托到匿名委托到拉姆da表明式再到
Action<>和Func<>;
 [2].
深深解析委托与事件;


3、事件的声明:分为详细申明和省略申明:

链式编制程序:将多少个操作通过点号链接在联合成为一句代码,是代码的可读性更好,代表masonry框架

·         
能够动用MulticastDelegate的实例方法GetInvocationList()来取得委托链中保有的寄托

事件

 参考:深远精晓事件的本色;
 对象1是事件发生者或发送者,对象二是事件接收者或订阅者,对象一产生音讯,对象二响应并拍卖新闻(事件/新闻机制)。
 event 是 delegate 的高等级格局,事件封装了委托,委托封装了办法。事件涵盖三个私房委托,事件提供对个人控制委托的结构化访问,当事件触发时,调用委托来挨家挨户调用调用列表中的方法。在事件中,委托是事件的发起者
sender 将 伊芙ntArgs 传递给处理者的管道。

(一)详细注解:

public delegate void MyDelegateEventHandler();
    public class Event
    {
        private MyDelegateEventHandler myDelegateEventHandler;
        public event MyDelegateEventHandler MyDelegate
        {
            add
            {
                this.myDelegateEventHandler += value;
            }
            remove
            {
                this.myDelegateEventHandler -= value;
            }
        }
    }

链式编制程序的风味:方法的再次回到值是block,block必须有再次回到值(本人对象),block参数(必要操作的值)

·          不可能创作包罗 out 参数的寄托

1. 事件注脚

 保存和调用事件处理程序。

public [static] event 委托类型 Notify; 

 推荐应用:事件采用正规的约定义委托类型

public delegate void EventHandler(object sender, EventArgs e); 

(二)简略表明:

public delegate void MyDelegateEventHandler();
    public class Event
    {
         public event MyDelegateEventHandler myDelegate;
    }

响应式编制程序:不需求思念调用的逐条,只需求思量结果,类似于蝴蝶效应,发生叁个事变,会潜移默化很多东西,这个事件就像是流1样的流传出去,借用面向对象的一句话正是万物皆流。

二、事件的简介

2. 事件注册格局

 ·  方法情势
  [1]. 实例方法:publisher.Notify += subscriber.实例方法;
  [2]. 静态方法:publisher.Notify += Subscriber.静态方法;
 ·  委托格局
  [1]. 实例方法:publisher.Notify += new 伊夫ntHandler(subscriber.实例方法);
  [2]. 静态方法:publisher.Notify += new 伊芙ntHandler(Subscriber.静态方法);
 ·  匿名方式
  publisher.Notify += delegate(object source, EventArgs args) { … };
 ·  Lambda表达式
  publisher.Notify += (source, args) => { … };
 :publisher
是发表者类对象;subscriber 是订阅者类对象,Subscriber 是订阅者类。

能够看看,在完整表明中率先添加了三个信托项目标字段,然后暴漏了增加和移除事件处理器的效益,不过大家经常用的是回顾注解,因为代码越发简明,

代表:KVO

C# 中的“事件”是当目的爆发1些事情时,类向该类的客户提供公告的壹种格局。

3. 事件访问器(伊芙nt Accessor)

 事件访问器表现为 void 方法,add 和 remove 访问器均含有隐式值参数
value。通过为事件证明自定义的轩然大波访问器,此时风云尚无内嵌委托对象,要求自定义添加和移除注册事件的主意来自行封装贰个信托的实例。事件的
add 和 remove 无法缺且必须有落实主体但足以为空。

 private MyEventHandler notify = null;   /// [1] 声明委托的实例
 public event MyEventHandler Notify      /// [2] 事件封装委托的实例
 {
   add      /// 增加
   {
     if (null != value)
       notify += value;
   }
   remove   /// 删除
   {
     Delegate[] funList = notify.GetInvocationList();   /// 获取调用列表
     if (-1 != Array.IndexOf(funList, value))
       notify -= value;             
   }
 }

 参考
 [1]. 字段访问器 ~ 事件访问器 ~
索引器;
 [2]. C#
事件访问器;


能够见见事件对外界隐藏了多数功能,它的本来面目正是对个中央委员托字段的3个包装(encapsulation),幸免外界偷用滥用委托字段。

函数式编制程序:把操作尽量写成壹体系嵌套的函数大概措施调用

一、事件的评释:

函数指针 vs 委托

 回调函数,Callback,在函数体内调用主调用函数中的函数。
 · 函数指针:保存函数的入口地址,作为函数的参数、用于调用函数;
   委托:保存函数的输入地址同时保存调用该函数的类/类实例的引用;
 · 委托扩张性更好,帮忙多播委托(MulitCast)和异步调用;

那就是说难题来了:第贰个难点:有了寄托为啥还会有事件吧,事件之中不正是信托吗,原因是为着以免public型的委托字段在外边被滥用,比如信托能够用invoke调用,

函数式编制程序的表征:每1个艺术必须有重返值(自个儿对象),把函数只怕block当做参数,block参数(需求操作的值)block重回值(操作结果)

宣称的格式为:<access modifier> event <delegate type>
伊夫ntName

委托 vs 事件

 · 
委托协理”+”和”-“、”+=”和”-=”、赋值运算符”=”;事件仅仅辅助”+=”和”-=”;
 ·  Delegate
是类(型),伊芙nt 是成员,伊芙nt 成员类型派生于 Delegate;
 · 
委托常用来发挥回调,事件发布外发的接口;
 · 
委托:能够在类外部触发、允许直接通过委托调用相应的处理函数:委托对象(参数列表);
    事件:只可以在类内部触发、通过公布者类提供的 public 方法去调用。
 :事件涵盖三个私人住房的信托对象。
事件的封装性和易用性更好。

 public MyEventHandler Notify1;
 public event MyEventHandler Notify2;

 其实,Notify一 也等于 Class 里面包车型客车 字段Field,访问级别 public ,Notify二约等于 属性Property,访问级别也是 public,可是,Notify贰 内部封装了1个访问级别为 private 的 委托对象!(带 event
关键字,编写翻译之后,委托对象变成
private,并自动生成多少个与信托对象对应的事件)
 属性封装字段,事件封装委托。
 威尼斯人线上娱乐 1 
 
 参考
 [1]. Event
详解;
 [2]. 谈 C# 中的 delegate – hyddd –
博客园;
 [3]. 不惧面试 –
关于信托;2个信托的例子;


然则事件只辛亏+=或-=的左手,那样就充实了总体程序的安全性。

代表:ReactiveCocoa

       
因为使用委托来声称事件,所以在类里声称事件时,首先必须先注解该事件的信托项目<delegate
type>(如若未有申明的话)。在上头大家早就提到过了寄托项目标评释,可是在.net
framework下为事件采用的嘱托项目实行宣示时有更严酷的规定:

阅览者格局

 Observer Pattern,即 Subject-Observer,又称监听形式 (Source/Listener)
或 宣布-订阅格局(Publisher-Subscriber),格局中的皇后。Observer
情势定义对象间的1(Subject)对多(Observer)的依靠关系,当一个目的意况改变时,依赖于它的其余对象会被自动告知并立异。Observer
格局一对多将借助具体转会为借助抽象,是壹种松耦合的设计方式,但抽象类Subject仍旧借助于抽象类(接口)Observer。逻辑关系图:
威尼斯人线上娱乐 2
 :事件处理程序即被信托的法子。Observer
方式典例:报纸订阅、短信分发、太阳能热水器,可参考 信托和事件详解 –
补充;

Java API 内置的观看者格局

  • java.util.Observable    — Subject 被观望者
  • java.util.Observer        — Observer 观察者

参考:

  • 设计方式学习笔记 –
    观望者形式;

首个难点:这委托和事件的涉嫌何以的啊?我们说事件是依据委托的。1方面,事件需求委托来做二个束缚,这一个约束规定了轩然大波源发送什么需求给事件的订阅者,

ReactiveCocoa常见类

(1)、 事件的嘱托项目应利用八个参数;

问题

  · 怎样界定事件只允许三个客户订阅?
 将事件注明为 private,然后提供八个 public
方法用于注册和注销。或应用事件访问器。
· 如何赢得四个订阅者的再次回到值?
 利用 Delegate 类的静态方法 Delegate[]
GetInvocationList(),委托/事件变量调用之,然后遍历包涵委托方法的数组即可。

 

事件订阅者的事件处理器必须和那个约束相对应才足以订阅那一个事件,另1方面,事件订阅者收到事件过后做出事件处理器,而以此事件处理器必须经过委托才能够实现。

在RAC中最宗旨的类RACSiganl,化解那些类就能用ReactiveCocoa开发了。

(二)、五个参数分别是:提示事件源的“对象源”参数和包装事件的其余任何有关新闻的“e”参数;

四、简单实例:

RACSignal:复信号类,一般代表以往有多少传递,只要有数据变化,非连续信号内部接收到多少,就会立刻发出数据。

(三)、“e”参数的连串应为EventArgs 类或派生自 伊夫ntArgs 类。

Example:做一个窗口,有文本框和按钮,点击按钮文本框展现时间,不用WindowsForms

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ConsoleApp14
{
    class Program
    {
        public static TextBox textBox;
        public static Button button;
        static void Main(string[] args)
        {
            Form form = new Form();
            TextBox textBox = new TextBox();
            Button button = new Button();
            form.Controls.Add(textBox);
            form.Controls.Add(button);
            textBox.Width = 400;
            button.Top = 100;
            button.Click += Button_Click;
            form.ShowDialog();
        }

        private static void Button_Click(object sender, EventArgs e)
        {
            textBox.Text = DateTime.Now.ToString();
        }
    }
}

威尼斯人线上娱乐 3

 

注意:

如下的定义:

此地举的事例正是windowsforms内部的代码,咱们说事件笔者是不会时有发生的是由事件源内部的逻辑所接触,在本例中,并不是人按了按钮然后按钮触发了风浪,

随机信号类(RACSignal),只是意味着当数码变动时,实信号内部会发生数据,它本身不抱有发实信号的力量,而是交由内部八个订阅者去发生。

public delegate void PrintHandler(object sender,System.EventArgs e);

那当中还有一个小进度,就是当按钮被key down再key up时,向程序内部发送了一文山会海电子通信号,文告电脑,然后再发生事件,

暗中同意贰个信号都以冷复信号,也等于值改变了也不会触发,唯有订阅了那几个实信号,那么些时域信号才成为热复信号,值改变了才会触发。

下一场咱们才能声称该委托类型的事件

5、表明事件的相干约定:

RACSignal的简练利用:

例如:

用以注解事件的委托一般用:事件+EvnetHandler,参数1般有三个,第多个事件源,第3个伊芙ntArgs的派生类,用于触发事件的方法名类同为On+方法名,

   //RACSignal底层落成:

public event PrintHandler Print;

走访级别Protected。只怕有点蒙,举个实例就懂了。

    //一创立确定性信号,首先把didSubscribe保存到信号中,还不会接触

当事件发生时,将调用其客户提要求它的寄托。

Example:举三个主顾在KFC点餐的例证

namespace ConsoleApp15
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            Waitor waitor = new Waitor();
            customer.Order += waitor.Serve;
            customer.Eat();
            customer.Pay();
        }
    }
    public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
    public class Customer
    {
        public int Money { get; set; }
        public event OrderEventHandler Order;
        public void Pay()
        {
            Console.WriteLine($"OK,{Money} dollars");
        }
        public void Eat()
        {
            Console.WriteLine("Let's go to the KFC...");
            Console.WriteLine("Stand in front of the waitor...");
            Console.WriteLine("A hamburger,Please...");
            OnOrder();
        }
        protected void OnOrder()
        {
            OrderEventArgs orderEventArgs = new OrderEventArgs();
            orderEventArgs.Snack = "Hamburger";
            orderEventArgs.Size = "large";
            this.Order.Invoke(this, orderEventArgs);

        }
    }
    public class OrderEventArgs : EventArgs
    {
        public string Snack { get; set; }
        public string Size { get; set; }
    }
    class Waitor
    {
        public void Serve(Customer customer, OrderEventArgs e)
        {
            Console.WriteLine($"Here is your snack {e.Snack}");
            int price = 20;
            switch (e.Size)
            {
                case "large":
                    price *= 2;
                    break;
                case "small":
                    price *= 1;
                    break;
                default:
                    break;
            }
            customer.Money += price;
        }
    }
}

    //贰当时域信号被订阅,也便是调用signal的subscribeNext:nextBlock

2、调用事件:

威尼斯人线上娱乐 4

 

   
//2.壹subscribeNext内部创造订阅者subscriber,并且把nextBlock保存到subcriber中

       
类证明了事件过后,能够就好像处理所提示的委托项目标字段那样处理该事件。假设未有其余客户将委托与该事件绑定,则该字段将为空;不然该字段引用应在调用该事件时调用的寄托。由此,调用事件时1般先检查是或不是为空,然后再调用事件。(调用事件,即触发事件,只好从注明该事件的类内实行)

依据事件的多少个因素,首先须要事件源,做1个Customer类,还索要贰个轩然大波订阅者,做四个Waitor类,然后依照订阅关系去写具体的法子,订阅关系customer.Order += waitor.Serve; Customer点餐Waitor服务,waitor类中上餐并算好价格,那个时候供给一个事件处理器Order伊芙ntHandler,那几个委托的参数需求三个Order伊夫ntArgs,创设这一个类写好属性,在写好委托和事件,然后在Customer类中写点餐事件,点餐事件为Protected的,和public型的信托字段1样幸免被外界滥用,升高安全性。

    //2.二subscribeNext内部调用signal的didSubscribe

if(Print != null)

想融会贯通其实也简单,只必要将事件的七个要素每1个点数出来,那么最终事件也就出来了。

    //3.Signal的didsubscribe中调用[subscriber sendNext:@1];

{

 

    //3.二sendNext底层其实便是履行subscriber的nextBlock

                Print (this,e);

从那之后事件下结论收尾,有不明之处还请指教。                201⑧-0八-一七   1陆:四三:1玖

 

    //一创立时域信号

}

    RACSignal *signal = [RACSignal createSignal:^RACDisposable *
_Nullable(id<RACSubscriber>  _Nonnull subscriber) {

三、事件绑定:

        //每当有订阅者订阅数字信号,就会调用该block

        从类的外侧来看,事件就象类的一个共用成员,通过 类名.事件名
的款型来访问,不过只好对它做绑定和化解绑定的操作,而无法有别的操作。

        //三发送复信号

类名. Print += new PrintHandler(绑定的不二法门名) //
将有个别方法绑定到Print事件上

        [subscriber sendNext:@”1″];

类名. Print -= new PrintHandler(绑定的办法名) //
将有个别已绑定到Print事件上的点子从Print事件上排除

        [subscriber sendNext:@”2″];

三、委托和事件的应用

        [subscriber sendNext:@”3″];

委托和事件在用户界面程序里用的可比的多,比如象在winform或webform的用户UI上的button和它的click事件:

        //假设不再发送数据,内部会自行调用[RACDisposable
disposable]注销订阅功率信号

// 将Button1_Click()方法绑定到按钮控件Button一的Click事件上

        [subscriber sendCompleted];

this.Button1.Click += new System.EventHandler(this. Button1_Click);

        [subscriber sendNext:@”5″];

private void Button1_Click(object sender, System.EventArgs e)    //
Button1_Click()方法

        return [RACDisposable disposableWithBlock:^{

{

           
//block调用的时刻:当连续信号发送达成可能发送错误,就会履行那几个blcok,撤废订阅时限信号

                ……

            //执行完block后,当前复信号就不设有被订阅了

}

            NSLog(@”数字信号订阅者被灭绝”);

然则除了用户界面程序外,在许多任哪个地方方也采纳了事件驱动格局,比如观看者方式(Observer)或宣布/订阅(Publish/Subscribe)里:在1个类里宣布(Publish)有个别可以被触发的事件,而其它的类就能够来订阅(Subscribe)该事件。壹旦那么些公布者类触发了该事件,那么运营时环境会立时告知全数订阅了该事件的订阅者类:那个事件产生了!从而各种订阅者类能够作出它们本身的反馈(调用相应措施)。

        }];

    }];

    //2订阅时限信号,才会激活功率信号

    [signal subscribeNext:^(id  _Nullable x) {

        //每当有功率信号发出数据,调用该block

        NSLog(@”接收数据:%@”,x);

    }];

RACSubscriber:表示订阅者的情趣,用于发送实信号,那是四个协议,不是贰个类,只要依照这一个体协会议,并且实现格局才能变成订阅者。通过create创制的功率信号,都有一个订阅者,帮忙他发送数据。

RACDisposable:用于撤除订阅也许清理能源,当时限信号发送达成或然发送错误的时候,就会活动触发它。

使用情状:不想监听有个别连续信号时,能够经过它主动积极撤回订阅复信号

RACSubject:实信号提供者,自个儿能够充当时域信号,又能发送功率信号。

接纳情况:平日用来代替代理,有了它,就不必定义代理了。

RACReplaySubject:重复提供非功率信号类,RACSubject的子类。

RACReplaySubject与RACSubject区别:

RACReplaySubject能够头阵送时域信号,再订阅实信号,RACSubject就不得以

利用景况壹:假如一个非时域信号每被订阅一遍,就要求把后边的值重新发送叁回,使用重复提供实信号类

接纳景况2:能够设置capacity数量来限制缓存的value的数码,即值缓存最新的多少个值。

RACSubject和RACReplaySubject的简练利用:

//RACSubject:底层达成与RACSignal不一致等

   
//壹调用subscribeNext订阅时域信号,只是把订阅者保存起来,并且订阅者的nextBlock已经赋值了

   
//二调用sendNext发送时域信号,遍历刚刚保存的拥有订阅者,3个2个调用订阅者的nextBlock

    //1创立能量信号

    RACSubject *subject = [RACSubject subject];

    //二订阅复信号

    [subject subscribeNext:^(id  _Nullable x) {

        NSLog(@”第二个订阅者%@”,x);

    }];

    [subject subscribeNext:^(id  _Nullable x) {

        NSLog(@”第二个订阅者%@”,x);

    }];

    //三发送非能量信号

    [subject sendNext:@”1″];

    //RACReplaySubject的底层完成:

   
//一.调用sendNext发送时限信号,把值保存起来,然后遍历刚刚保存的享有的订阅者,1个多个调用订阅者的nextBlock

   
//二.调用subscribeNext订阅能量信号,遍历保存的有所值,二个1个调用订阅者的nextBlock

   
//即便想当1个确定性信号被订阅,就再一次播放在此之前全数值,要求头阵时域信号,再订阅模拟信号(也正是先保存值,再订阅值)

    //一.创建非确定性信号

    RACReplaySubject *replaySubject = [RACReplaySubject
replaySubjectWithCapacity:2];

    [replaySubject subscribeNext:^(id  _Nullable x) {

        NSLog(@”第0个订阅者收到的数据%@”,x);

    }];

    //二发送时域信号

    [replaySubject sendNext:@”1″];

    [replaySubject sendNext:@”2″];

    [replaySubject sendNext:@”3″];

    //三订阅时域信号

    [replaySubject subscribeNext:^(id  _Nullable x) {

        NSLog(@”第一个订阅者收到的数据%@”,x);

    }];

    [replaySubject subscribeNext:^(id  _Nullable x) {

        NSLog(@”第一个订阅者收到的数据%@”,x);

    }];

 

RACTuole:元组类,类似于NSArray,用于包装值

RACSequence:RAC中的集合类,用于代替NSArray,NSDictionary,可以利用它来非常的慢遍历数组和字典。

RACCommand:RAC中用来处监护人件的类,能够把事件怎么样处理,实践中多少怎样传递,包装到那么些类中,它能够很有益于的监察和控制事件的实施过程。

运用景况:监听按钮点击,互连网请求

RACCommand的归纳利用:

 

RACMulticasConnection:用于当一个时域信号,被壹再订阅时,为了保证开创复信号时,制止频仍调用功率信号中的block,造成副效能,能够行使这几个类处理。

使用注意:RACMulticastConnection通过RACSignal的-publish也许-muticast方法创立。

RACScheduler:RAC中的队列,用GCD封装的。

RACUnit:表示stream不包涵有意义的值,也便是看到那些,能够一向精晓为nil

RACEVent:把数量包装成时域信号事件(singnal
event)。它至关心敬爱要透过RACSignal的-materialize来使用的。

ReactiveCocoa开发常见用法

取而代之代理:rac_signalForSelector

代替KVO:rac_valueAndChangesForKeyPath

监听事件:rac_signalForControlEvents

取代公告:arc_addObserverForName

监听文本框文字改变:rac_textSignal

ReactiveCocoa常见宏

RAC(TARGET,[KEYPATH,[NIL_VALUE]]):用于给有个别对象的某些属性绑定

//只要文本框文字改变,就会改变label的文字

//只要文本框文字改变,就会修改label的文字

RAC(self.labelView,text) = _textfield.rac_textSignal;

RACObserve(self,name):监听某些对象的个性,重回的是复信号

[RACObserve(self.view,center) subscribeNext:(^id x){

        NSLog(@”%@”,x);

}

@weakfy(Obj)和@strongfy(Obj),供给手动导入RACEXTScope.h才能运用

RACTuplePack:把数据包装成RACTuple(元组类)

//把参数中的数据包装成元组

RACTuple *tuple = RACTuplePack(@10,@20);

RACTupleUnpack:把RACTuple(元组类)解包成对应的多少

参考:

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图