事件剖析,观望者形式

本节对事件开始展览总括。

为何使用ReactiveCocoa

初稿公布时间为:200九-11-0壹 —— 来源于本身的百度文章 [由搬家工具导入]

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

二、事件:

壹、开发进度中,状态及气象之间依赖过多,状态变化很难跟踪,令人咳嗽,RAC能更为有效处总管件流,而无需去管理状态。

1、委托的扬言:

参考
[1]. 初识事件 到
自定义事件;
[2]. 从品类不安全的委托 到
类型安全的事件;
[3]. 函数指针 ~
C#中的委托(Delegate)和事件(伊夫nt);
[4]. C# 中的委托和事件 –
张子阳;
   C# 中的委托和事件(续) –
张子阳;

一、概念:Event:A member that enables an object or class to provide notifications;官方的表达是那样,便是说在C#中,事件是使

贰、收缩方法的调用,由于它跟踪状态和值的变型,因此不须要状态更新时手动调用,裁减失误的也许。

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


对象大概类具有布告能力的积极分子。比如说手提式有线话机接到短信提醒本人去开会,那么手提式有线电电话机就担任了一个拥有通知能力的分子。说白了,事件

三、提供联合的消息传递方法,将通报、代理、kvo以及其余全体UIControl事件的变型都进行督察,当产生变化时,就会传送事件和值。

例如:

委托

 委托本质是一个密封类,定义方法的类型,将艺术作为艺术的参数。委托包括二个颇具同样签名和重临值类型的雷打不动的形式列表(调用列表)。
 委托注解: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);

一. 创制法委员会委员托(对象)

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

  · 为委托对象分配内部存储器;
  · 把艺术添加到委托对象的调用列表中;

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

伍、事件的处理及监听能够置身1起,符合高内聚、低耦合的思量

     
委托表明定义了一连串型,它用壹组特定的参数以及重临类型来封装方法。对于静态方法,委托对象封装要调用的不贰法门。对于实例方法,委托对象同时包装2个实例和该实例上的3个艺术。假如你有三个信托对象和1组适当的参数,则足以用那些参数调用该信托。

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]. 从委托到匿名委托到Lambda表明式再到
Action<>和Func<>;
 [2].
长远解析委托与事件;


三、事件的宣示:分为详细注脚和简易表明:

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

·         
可以使用MulticastDelegate的实例方法GetInvocationList()来收获委托链中持有的嘱托

事件

 参考:深深驾驭事件的真面目;
 对象壹是事件爆发者或发送者,对象二是事件接收者或订阅者,对象一发生新闻,对象贰响应并拍卖音讯(事件/音讯机制)。
 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、事件的简介

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# 中的“事件”是当对象产生一些事情时,类向该类的客户提供公告的一种办法。

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#
事件访问器;


能够见见事件对外界隐藏了绝大多数意义,它的本色正是对内部委托字段的三个卷入(encapsulation),防止外界偷用滥用委托字段。

函数式编制程序:把操作尽量写成1各类嵌套的函数只怕措施调用

1、事件的评释:

函数指针 vs 委托

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

那就是说难点来了:第三个问题:有了委托为啥还会有事件呢,事件之中不便是信托吗,原因是为了防范public型的委托字段在外边被滥用,比如信托能够用invoke调用,

函数式编制程序的性状:每2个办法必须有重临值(本身对象),把函数恐怕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 ,Notify2也就是 属性Property,访问级别也是 public,不过,Notify二 内部封装了三个访问级别为 private 的 委托对象!(带 event
关键字,编写翻译之后,委托对象变成
private,并自动生成多个与寄托对象对应的事件)
 属性封装字段,事件封装委托。
 美高梅开户网址 1 
 
 参考
 [1]. Event
详解;
 [2]. 谈 C# 中的 delegate – hyddd –
博客园;
 [3]. 不惧面试 –
关于信托;一个信托的例子;


不过事件只幸好+=或-=的左手,那样就充实了总体程序的安全性。

代表:ReactiveCocoa

       
因为使用委托来声称事件,所以在类里声称事件时,首先必须先评释该事件的嘱托项目<delegate
type>(要是未有表明的话)。在上头我们早已涉嫌过了寄托项目的注脚,可是在.net
framework下为事件采纳的委托项目实行宣示时有更严谨的分明:

观望者情势

 Observer Pattern,即 Subject-Observer,又称监听方式 (Source/Listener)
或 发表-订阅情势(Publisher-Subscriber),方式中的皇后。Observer
格局定义对象间的一(Subject)对多(Observer)的注重性关系,当3个对象意况改变时,信赖于它的别样对象会被活动告知并立异。Observer
形式1对多将借助具体转会为借助抽象,是一种松耦合的设计形式,但抽象类Subject照旧借助于抽象类(接口)Observer。逻辑关系图:
美高梅开户网址 2
 :事件处理程序即被信托的章程。Observer
情势典例:报纸订阅、短信分发、热水器,可参考 委托和事件详解 –
补充;

Java API 内置的观看者格局

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

参考:

  • 设计格局学习笔记 –
    阅览者方式;

第二个难题:那委托和事件的关联何以的呢?我们说事件是基于委托的。1方面,事件要求委托来做三个封锁,这么些约束规定了风云源发送什么供给给事件的订阅者,

ReactiveCocoa常见类

(一)、 事件的寄托项目应使用七个参数;

问题

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

 

事件订阅者的轩然大波处理器必须和那几个约束相对应才方可订阅那么些事件,另一方面,事件订阅者收到事件之后做出事件处理器,而以此事件处理器必须通过委托才足以形成。

在RAC中最中央的类RACSiganl,解决那几个类就能用ReactiveCocoa开发了。

(2)、三个参数分别是:提示事件源的“对象源”参数和包裹事件的别样任何有关音讯的“e”参数;

4、不难实例:

RACSignal:非信号类,壹般代表以往有数量传递,只要有数量变化,频域信号内部接收到数码,就会立即发出数据。

(三)、“e”参数的项目应为伊夫ntArgs 类或派生自 伊芙ntArgs 类。

Example:做2个窗口,有文本框和按钮,点击按钮文本框突显时间,不用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);

那中间还有3个小进程,便是当按钮被key down再key up时,向程序内部发送了1层层电子通信号,文告电脑,然后再发生事件,

暗中同意二个复信号都以冷频域信号,也正是值改变了也不会接触,只有订阅了那一个复信号,那一个非实信号才改成热实信号,值改变了才会接触。

下一场大家才能宣称该委托类型的风浪

5、申明事件的连锁约定:

RACSignal的简约利用:

美高梅开户网址,例如:

用以表明事件的嘱托1般用:事件+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

贰、调用事件:

美高梅开户网址 4

 

   
//二.一subscribeNext内部创设订阅者subscriber,并且把nextBlock保存到subcriber中

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

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

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

if(Print != null)

想融会贯通其实也简单,只必要将事件的五个成分每3个点数出来,那么最后事件也就出来了。

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

{

 

    //3.2sendNext底层其实就是履行subscriber的nextBlock

                Print (this,e);

由来事件下结论收尾,有暧昧之处还请指教。                201八-0八-一7   1陆:四3:1九

 

    //壹创设非确定性信号

}

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

三、事件绑定:

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

        从类的外面来看,事件就象类的1个集体成员,通过 类名.事件名
的花样来拜会,然则只好对它做绑定和平解决除绑定的操作,而无法有其余操作。

        //三发送功率信号

类名. 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)里:在三个类里公布(Publish)有个别能够被触发的事件,而别的的类就能够来订阅(Subscribe)该事件。壹旦那几个公布者类触发了该事件,那么运营时环境会马上告知全数订阅了该事件的订阅者类:那些事件发生了!从而各样订阅者类能够作出它们自身的反馈(调用相应措施)。

        }];

    }];

    //二订阅时域信号,才会激活实信号

    [signal subscribeNext:^(id  _Nullable x) {

        //每当有能量信号发出数据,调用该block

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

    }];

RACSubscriber:表示订阅者的情致,用于发送频域信号,那是八个研商,不是一个类,只要遵守这么些体协会议,并且完成方式才能变成订阅者。通过create创造的时域信号,都有三个订阅者,接济她发送数据。

RACDisposable:用于撤销订阅或然清理财富,当时域信号发送达成或许发送错误的时候,就会自动触发它。

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

RACSubject:随机信号提供者,本人可以充当复信号,又能发送非确定性信号。

选用景况:平时用来替代代理,有了它,就不要定义代理了。

RACReplaySubject:重复提供实信号类,RACSubject的子类。

RACReplaySubject与RACSubject区别:

RACReplaySubject能够首发送随机信号,再订阅功率信号,RACSubject就不能

应用情状壹:要是贰个信号每被订阅3回,就供给把以前的值重新发送一回,使用重复提供实信号类

动用情况2:能够设置capacity数量来界定缓存的value的数据,即值缓存最新的多少个值。

RACSubject和RACReplaySubject的不难利用:

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

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

   
//2调用sendNext发送时域信号,遍历刚刚保存的兼具订阅者,三个三个调用订阅者的nextBlock

    //1创立实信号

    RACSubject *subject = [RACSubject subject];

    //2订阅功率信号

    [subject subscribeNext:^(id  _Nullable x) {

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

    }];

    [subject subscribeNext:^(id  _Nullable x) {

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

    }];

    //3发送功率信号

    [subject sendNext:@”1″];

    //RACReplaySubject的尾部完毕:

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

   
//2.调用subscribeNext订阅非时限信号,遍历保存的持有值,贰个1个调用订阅者的nextBlock

   
//如若想当一个功率信号被订阅,就再一次播放此前全体值,须求头阵连续信号,再订阅时域信号(也正是先保存值,再订阅值)

    //一.成立时限信号

    RACReplaySubject *replaySubject = [RACReplaySubject
replaySubjectWithCapacity:2];

    [replaySubject subscribeNext:^(id  _Nullable x) {

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

    }];

    //2发送实信号

    [replaySubject sendNext:@”1″];

    [replaySubject sendNext:@”2″];

    [replaySubject sendNext:@”3″];

    //三订阅时限信号

    [replaySubject subscribeNext:^(id  _Nullable x) {

        NSLog(@”第3个订阅者收到的数据%@”,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地图