函数式 响应编程

函数式 响应编程

ReactiveCocoa的基本使用方法

ReactiveCocoa是github一个开源项目,是在iOS平台上对FRP的实现。FRP的核心是信号,信号在ReactiveCocoa(以下简称RAC)中是通过RACSignal来表示的,信号是数据流,可以被绑定和传递。

可以把信号想象成水龙头,只不过里面不是水,而是玻璃球(value),直径跟水管的内径一样,这样就能保证玻璃球是依次排列,不会出现并排的情况(数据都是线性处理的,不会出现并发情况)。水龙头的开关默认是关的,除非有了接收方(subscriber),才会打开。这样只要有新的玻璃球进来,就会自动传送给接收方。可以在水龙头上加一个过滤嘴(filter),不符合的不让通过,也可以加一个改动装置,把球改变成符合自己的需求(map)。也可以把多个水龙头合并成一个新的水龙头(combineLatest:reduce:),这样只要其中的一个水龙头有玻璃球出来,这个新合并的水龙头就会得到这个球。

RAC统一了对KVO、UI Event、Network request、Async work的处理,因为它们本质上都是值的变化(Values over time)。

替代KVO

@property(strong) NSString *username;

[RACObserve(self,username) subscribeNext:^(NSString *newName){

    NSLog(@"%@",newName);

}];

只要username发生变化就打印出来。体现绑定和响应。

[[RACObserver(self,username) filter:^(NSString *newName) {

   return [newName hasPrefix:@"j"];

}] subscribeNext:^(NSString *newName) {

   NSLog(@"%@",newName);

}

增加一个过滤器

替代selector


1

2

3

4

self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) {

    NSLog(@"button was pressed!");

    return [RACSignal empty];

}];

流的实现


1

2

3

4

5

RAC(self, timeLabel.text) = [[[RACSignal interval:1 onScheduler:[RACScheduler currentScheduler]] startWith:[NSDate date]] map:^id (NSDate *value) {

   NSLog(@"value:%@", value);

   NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit |NSMinuteCalendarUnit NSSecondCalendarUnit fromDate:value];

  return [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)dateComponents.hour, (long)dateComponents.minute, (long)dateComponents.second];

}];

  

组合


1

2

3

RAC(self, submitButton.enabled) = [RACSignal combineLatest:@[self.usernameField.rac_textSignal, self.passwordField.rac_textSignal] reduce:^id (NSString *userName, NSString *password) {

  return @(userName.length >= 6 && password.length >= 6);

}];

将usernameField和passwordField的信号绑定在一起做reduce处理。返回一个BOOL值去跟self.submitButton.enabled进绑定。

网络请求


1

2

3

self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) {

    return [client logIn];

}];<br><br>[self.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) {<br>  [loginSignal subscribeCompleted:^{<br>    NSLog(@"Logged in successfully!");<br>  }];<br>}];

  

时间: 2024-10-14 18:39:12

函数式 响应编程的相关文章

函数式响应编程

ReactiveCocoa的基本使用方法 ReactiveCocoa是github一个开源项目,是在iOS平台上对FRP的实现.FRP的核心是信号,信号在ReactiveCocoa(以下简称RAC)中是通过RACSignal来表示的,信号是数据流,可以被绑定和传递. 可以把信号想象成水龙头,只不过里面不是水,而是玻璃球(value),直径跟水管的内径一样,这样就能保证玻璃球是依次排列,不会出现并排的情况(数据都是线性处理的,不会出现并发情况).水龙头的开关默认是关的,除非有了接收方(subscr

函数式响应式编程 - Functional Reactive Programming

我们略过概念,直接看函数式响应式编程解决了什么问题. 故事从下面这个例子展开: 两个密码输入框,一个提交按钮. 密码.确认密码都填写并一致,允许提交:不一致提示错误. HTML 如下: <input id="pwd" placeholder="输入密码" type="password" /><br /> <input id="confirmPwd" placeholder="再次确认&q

Scalaz(54)- scalaz-stream: 函数式多线程编程模式-Free Streaming Programming Model

长久以来,函数式编程模式都被认为是一种学术研究用或教学实验用的编程模式.直到近几年由于大数据和多核CPU的兴起造成了函数式编程模式在一些实际大型应用中的出现,这才逐渐改变了人们对函数式编程无用论的观点.通过一段时间对函数式编程方法的学习,我们了解到Free Monad的算式/算法关注分离(separation of concern)可以是一种很实用的函数式编程模式.用Free Monad编写的程序容易理解并具备良好的可维护性.scalaz-stream的流程控制和多线程运算模式可以实现程序的安全

(3)lambda与函数式——响应式Spring的道法术器

本系列文章索引:<响应式Spring的道法术器>前情提要: 什么是响应式编程 | 响应式流本文源码 1.3 Hello,reactive world 前面两篇文章介绍了响应式编程和响应式流的特性,一味讲概念终是枯燥,还是上手敲一敲代码实在感受一下响应式编程的"手感"吧. 这一节,我们先了解一下lambda与函数式(已经了解的朋友可以直接跳到1.3.2),熟悉一下如何使用Reactor进行响应式编程,然后使用Spring Boot2,基于Spring 5的Webflux和Re

函数式Android编程(II):Kotlin语言的集合操作

原文标题:Functional Android (II): Collection operations in Kotlin 原文链接:http://antonioleiva.com/collection-operations-kotlin/ 原文作者:Antonio Leiva(http://antonioleiva.com/about/) 原文发布:2015-09-29 在简化代码方面,Lambda表达式是一个杰出的工具,而且还可以完成之前不可能完成的事.我们在这个系列文章的第一篇(Unlea

SimpleReact: 基于Java 8简单的FRP Fluent API

SimpleReact来自AOL的一个小型的支持并发的库包,其直接基于Java 8的CompletableFuture, JDK函数接口和Streams API构建,它的Fluent API能够提供解决90%的Reactive使用场景,重要的是没有带入任何复杂性.可以实现Functional Reactive Programming范式(简称:FRP,函数式响应编程) 使用SimpleReact能够方便扩展微服务,它能用于管理微服务的远程调用,能够应付高并发大型高性能平台的要求. 使用Simpl

ReactiveCocoa(RAC)

好处:代码高聚合,方便我们管理: 编程思想:函数式响应编程: 链式编程: CaculatorMaker.h #import <Foundation/Foundation.h> #define ADD #define KVO @interface CaculatorMaker : NSObject @property (nonatomic, assign) KVO int result; // + - (instancetype)add:(int)num; ADD - (CaculatorMak

JS函数式编程【译】4.在Javascript中实现函数式编程的技术

?? Functional Programming in Javascript 主目录上一章 建立函数式编程环境 第四章 在Javascript中实现函数式编程的技术 扶好你的帽子,我们现在要真正进入函数式的思想了. 这章我们继续下面的内容: 把所有的核心概念放到一个集中的范式里 探索函数式编程之美 一步步跟踪函数式模式相互交织的逻辑 我们将贯穿整章建立一个简单的应用做一些很酷的事情 你可能已经注意到,在上一章我们介绍Javascript的函数式库的时候引入了一些概念, 而不是在第二章<函数式编

函数响应式编程及ReactiveObjC学习笔记 (-)

最近无意间看到一个视频讲的ReactiveObjC, 觉得挺好用的 但听完后只是了解个大概. 在网上找了些文章, 有的写的比较易懂但看完还是没觉得自己能比较好的使用RAC, 有的甚至让我看不下去 这两天刚好公司项目交付闲下来, 想自己去啃下官方文档 ReactiveCocoa是一个基于函数响应式编程的OC框架. 那么什么是函数式响应式编程呢?概念我就不讲了 因为我讲的也不一定准确, 大家可以去baidu看看大神们的解释 下面我大概演示下响应式编程的样子 Masonry是比较常见的一个响应式框架,