本节对事件进展计算。

干什么选取ReactiveCocoa

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

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

二、事件:

一、开发进度中,状态及气象之间信赖过多,状态变化很难跟踪,令人高烧,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个持有通告能力的积极分子。说白了,事件

三、提供统一的音讯传递方法,将公告、代理、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。3个常用 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、原理:源于发生-响应模型:

5、事件的拍卖及监听能够放在一块儿,符合高内聚、低耦合的思辨

     
委托注脚定义了壹种档次,它用一组特定的参数以及再次回到类型来封装方法。对于静态方法,委托对象封装要调用的方式。对于实例方法,委托对象同时包装一个实例和该实例上的三个方式。即便您有3个委托对象和一组适当的参数,则足以用那个参数调用该信托。

2. 组合委托 (Combining Delegate)

 委托是定点的,委托对象被创设后就不会再被改成。委托组合拷贝的是操作数的副本,唯有相同类其他委托才得以结合。委托的3结合和移除分别用”+”和”-“;

  MyDel objDel = objDel1 + objDel2; 

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

RAC的编制程序思想

在C#中利用委托方法:

3. 调用委托

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

  用于调用委托的参数会去调用调用列表中的每一种方法。
  · 调用带重回值的嘱托:委托调用的重返值是其调用列表中最终3个艺术的重返值。
  · 调用带引用参数的信托:调用委托的参数会随着调用列表中艺术的调用而改变。
 :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].
深远解析委托与事件;


三、事件的表明:分为详细评释和精炼表明:

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

·         
能够使用MulticastDelegate的实例方法GetInvocationList()来获得委托链中保有的嘱托

事件

 参考:深深精通事件的原形;
 对象壹是事件产生者或发送者,对象2是事件接收者或订阅者,对象一产生消息,对象贰响应并处理音讯(事件/信息机制)。
 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;
    }

响应式编制程序:不要求考虑调用的顺序,只必要怀恋结果,类似于蝴蝶效应,产生叁个事件,会影响很多事物,那几个事件就如流一样的扩散出去,借用面向对象的一句话便是万物皆流。

二、事件的简介

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 是订阅者类。

能够见见,在完整表明中首先添加了3个委托项目的字段,然后暴漏了丰硕和移除事件处理器的效劳,但是大家平时用的是总结申明,因为代码特别简洁,

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


能够见到事件对外边隐藏了绝超越二分一功能,它的本质正是对当中央委员托字段的三个包装(encapsulation),防止外界偷用滥用委托字段。

函数式编制程序:把操作尽量写成壹层层嵌套的函数或然措施调用

壹、事件的评释:

函数指针 vs 委托

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

金沙注册送58 ,那么难点来了:第四个难题:有了委托为何还会有事件吧,事件之中不正是信托吗,原因是为了防止万1public型的嘱托字段在外界被滥用,比如信托能够用invoke调用,

函数式编制程序的特点:每二个形式必须有重回值(自个儿对象),把函数或许block当做参数,block参数(须要操作的值)block重临值(操作结果)

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

委托 vs 事件

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

 public MyEventHandler Notify1;
 public event MyEventHandler Notify2;

 其实,Notify一 也便是 Class 里面的 字段菲尔德,访问级别 public ,Notify二相当于 属性Property,访问级别也是 public,可是,Notify二 内部封装了一个访问级别为 private 的 委托对象!(带 event
关键字,编写翻译之后,委托对象变成
private,并自动生成八个与信托对象对应的风浪)
 属性封装字段,事件封装委托。
 金沙注册送58 1 
 
 参考
 [1]. Event
详解;
 [2]. 谈 C# 中的 delegate – hyddd –
博客园;
 [3]. 不惧面试 –
关于信托;一个信托的例子;


而是事件只能在+=或-=的左手,那样就充实了整整程序的安全性。

代表:ReactiveCocoa

       
因为使用委托来声称事件,所以在类里声称事件时,首先必须先申明该事件的信托项目<delegate
type>(假设未有表明的话)。在上头大家已经涉及过了寄托项目标注明,不过在.net
framework下为事件接纳的嘱托项目进行宣示时有更严厉的规定:

旁观者格局

 Observer Pattern,即 Subject-Observer,又称监听形式 (Source/Listener)
或 发表-订阅情势(Publisher-Subscriber),方式中的皇后。Observer
情势定义对象间的1(Subject)对多(Observer)的依赖性关系,当三个指标情状改变时,依赖于它的别的对象会被电动告知并革新。Observer
方式1对多将借助具体转会为借助抽象,是1种松耦合的设计情势,但抽象类Subject依然借助于抽象类(接口)Observer。逻辑关系图:
金沙注册送58 2
 :事件处理程序即被托付的格局。Observer
形式典例:报纸订阅、短信分发、空气能热水器,可参考 信托和事件详解 –
补充;

Java API 内置的观察者格局

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

参考:

  • 设计情势学习笔记 –
    观望者格局;

其次个难点:那委托和事件的关系怎么样的啊?大家说事件是基于委托的。1方面,事件需求委托来做1个约束,这些约束规定了风云源发送什么供给给事件的订阅者,

ReactiveCocoa常见类

(1)、 事件的嘱托项目应接纳三个参数;

问题

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

 

事件订阅者的事件处理器必须和那一个约束相对应才得以订阅那一个事件,另壹方面,事件订阅者收到事件随后做出事件处理器,而以此事件处理器必须通过信托才方可实现。

在RAC中最主题的类RACSiganl,解决这一个类就能用ReactiveCocoa开发了。

(贰)、多少个参数分别是:提示事件源的“对象源”参数和包裹事件的别的任何有关消息的“e”参数;

4、简单实例:

RACSignal:信号类,1般代表以后有数量传递,只要有多少变动,频域信号内部接收到多少,就会马上发出数据。

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

Example:做3个窗口,有文本框和按钮,点击按钮文本框展现时间,不用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();
        }
    }
}

金沙注册送58 3

 

注意:

正如的概念:

那里举的事例正是windowsforms内部的代码,我们说事件本身是不会发出的是由事件源内部的逻辑所接触,在本例中,并不是人按了按钮然后按钮触发了事件,

能量信号类(RACSignal),只是代表当数码变动时,复信号内部会时有产生数据,它本身不享有发时限信号的能力,而是交由内部八个订阅者去爆发。

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

这么些中还有3个小进度,就是当按钮被key down再key up时,向程序内部发送了1多级电子通讯号,通告电脑,然后再产惹祸变,

默许2个复信号都以冷功率信号,也正是值改变了也不会接触,只有订阅了这些时域信号,这几个时域信号才改为热功率信号,值改变了才会触发。

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

5、证明事件的连带约定:

RACSignal的简单利用:

例如:

用以注明事件的信托一般用:事件+EvnetHandler,参数一般有三个,第贰个事件源,第叁个伊芙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、调用事件:

金沙注册送58 4

 

   
//二.壹subscribeNext内部成立订阅者subscriber,并且把nextBlock保存到subcriber中

       
类申明了事件现在,能够就好像处理所提醒的嘱托项目标字段那样处理该事件。要是未有别的客户将委托与该事件绑定,则该字段将为空;否则该字段引用应在调用该事件时调用的嘱托。由此,调用事件时日常先反省是否为空,然后再调用事件。(调用事件,即触发事件,只可以从申明该事件的类内实行)

安分守己事件的八个因素,首先须求事件源,做2个Customer类,还索要几个事件订阅者,做一个Waitor类,然后依照订阅关系去写实际的艺术,订阅关系customer.Order += waitor.Serve; Customer点餐Waitor服务,waitor类中上餐并算好价钱,今年须求三个事件处理器Order伊夫ntHandler,这一个委托的参数须要3个Order伊芙ntArgs,创立那么些类写好属性,在写好委托和事件,然后在Customer类中写点餐事件,点餐事件为Protected的,和public型的寄托字段壹样幸免被外界滥用,升高安全性。

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

if(Print != null)

想融会贯通其实也简单,只须求将事件的6个成分每三个点数出来,那么最后事件也就出去了。

    //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(绑定的不2秘籍名) //
将某些已绑定到Print事件上的格局从Print事件上海消防弭

        [subscriber sendNext:@”2″];

3、委托和事件的采纳

        [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:表示订阅者的情致,用于发送频域信号,那是一个磋商,不是3个类,只要服从那么些体协会议,并且实现情势才能变成订阅者。通过create创设的功率信号,都有1个订阅者,帮忙她发送数据。

RACDisposable:用于撤消订阅或许清理财富,当随机信号发送实现或然发送错误的时候,就会自动触发它。

运用意况:不想监听有些时域信号时,能够经过它主动积极撤除订阅复信号

RACSubject:功率信号提供者,本身能够出任随机信号,又能发送频限信号。

采取景况:常常用来取代代理,有了它,就无需定义代理了。

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

RACReplaySubject与RACSubject区别:

RACReplaySubject能够头阵送时域信号,再订阅时限信号,RACSubject就无法

行使处境壹:就算2个复信号每被订阅三次,就需求把此前的值重新发送1回,使用重复提供非数字信号类

利用境况二:能够设置capacity数量来界定缓存的value的数额,即值缓存最新的多少个值。

RACSubject和RACReplaySubject的简短利用:

//RACSubject:底层达成与RACSignal不雷同

   
//一调用subscribeNext订阅非确定性信号,只是把订阅者保存起来,并且订阅者的nextBlock已经赋值了

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

    //一成立能量信号

    RACSubject *subject = [RACSubject subject];

    //二订阅时域信号

    [subject subscribeNext:^(id  _Nullable x) {

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

    }];

    [subject subscribeNext:^(id  _Nullable x) {

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

    }];

    //三发送功率信号

    [subject sendNext:@”1″];

    //RACReplaySubject的尾部实现:

   
//壹.调用sendNext发送时限信号,把值保存起来,然后遍历刚刚保存的具有的订阅者,三个3个调用订阅者的nextBlock

   
//2.调用subscribeNext订阅能量信号,遍历保存的持有值,3个一个调用订阅者的nextBlock

   
//如若想当多少个功率信号被订阅,就再也播放此前全数值,必要头阵非能量信号,再订阅非确定性信号(也便是先保存值,再订阅值)

    //①.创建频限信号

    RACReplaySubject *replaySubject = [RACReplaySubject
replaySubjectWithCapacity:2];

    [replaySubject subscribeNext:^(id  _Nullable x) {

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

    }];

    //二发送能量信号

    [replaySubject sendNext:@”1″];

    [replaySubject sendNext:@”2″];

    [replaySubject sendNext:@”3″];

    //3订阅时限信号

    [replaySubject subscribeNext:^(id  _Nullable x) {

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

    }];

    [replaySubject subscribeNext:^(id  _Nullable x) {

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