当前位置: 首页 > news >正文

如何建立基于CocoaPods的ReactiveCocoa工程

ReactiveCocoa 和 CocoaPods 一样也是目前很流行的 能方便和提高效率的框架.

其实不光ios 学习任何一门语音最快最直接的方法就是上手. 如果单单是看看文档只能是走马观花得到一个感性认识罢了.前两天之前一个公司的测试人员跟我联系说如何学习JAVA,我问他是怎么学的,他说从网上下了好多视频教程,一直在看视频教程,也买了一些书. 我问他敲了多少代码,他说很少. 其实跟他一样的人不少. 我觉得任何事情都不简单,因为看起来简单的事情自己没有实际做过的话 往往会遇到各种各样的问题. 这也是为什么在工作中制定项目进度计划的时候 我尽量给自己和团队中的人多争取时间的最主要的一个因素.

好了,自己一些啰嗦和感悟. 下面开始正式.


RAV is an Object-C framework for Functional Reavtive Programming;
两个关键点:
1:framework 既然是framework 那就跟你用的其他framework没什么区别 无非就是加到工程中引用罢了.不做多余解释
2:Functional Reavtive Programming 实时响应式编程

虾米引用被阿里收购后现在先上的mac版本的虾米音乐就是用Reactive Cocoa开发的.用阿里人自己的话来说就是

好东西啊,以前我们用 KVO 或 Notification 来自动绑定数据,改用 ReactiveCocoa 写以后,代码结构更佳简单清晰,同时代码行数直接减少 60% 以上

来点直观的对比吧,比如我们想要实现一个需求:当变量中的字符串改变后即时做出相应的反馈 我们用KVO 需要如下这样做

// In your viewDidLoad/awakeFromNib/init
[self addObserver:self 
       forKeyPath:@"someString" 
          options:NSKeyValueObservingOptionNew 
          context:&someStringChangeContext];

// In dealloc
[self removeObserver:self 
          forKeyPath:@"someString" 
             context:&someStringChangeContext];

// Elsewhere in your class
- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context
{
    if (context == &someStringChangeContext) {
        if ([keyPath isEqualToString:@"someString"]) {        
            // Do a bunch of stuff here
        }
    }
}

上面一坨代码 在应用Reactive Cocoa后 只有短短一行

[RACObserve(self, someString) distinctUntilChanged] subscribeNext:^(NSString *string) {
    // Do a bunch of things here, just like you would with KVO
}];

因为我之前安装了CocoaPods,所以我这次写的ReactiveCocoaDemo 是基于CocoaPods的.如果没有安装的可以童鞋,可以直接从github上下载ReactiveCocoa

1.打开xcode 创建一个工程,我命名的工程名为ReactiveCocoaDemo,

2.终端到工程路径下

cd ReactiveCocoaDemo/
pod search ReactiveCocoa

3.配置依赖文件

vi Podfile
    platform :ios,'5.0'
    pod 'ReactiveCocoa'
wq

4.下载文件

 pod install /update

5:打开“Build Phases” 选中相应的target, 添加 RAC 到 “Link Binary With Libraries”.加上libReactiveCocoa-iOS.a

如下图

6:在Header Search Paths 中添加$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include"

7:在 “Other Linker Flags” 添加 -ObjC

8:在ReactiveCocoaDemo-Prefix.pch 将RAC的头文件加进去

#import "ReactiveCocoa.h"

两个输入框 一个提示的Lable 一个按钮,
1.当两个输入框的内容相同时 提示文字显示“成功” 按钮可以点击
2.当任意一个输入框没有输入内容时 提示文字显示“请输入” 按钮不可点击
3.当输入框非空且两个输入内容不同时 提示“请重新输入” 按钮不可点击

下面是部分实现代码:

@weakify(self);
[[RACObserve(self, warningText)
  filter:^(NSString *newString) {
      self.resultLabel.text = newString;
      return YES;
//          return [newString hasPrefix:@"Success"];
  }]
 subscribeNext:^(NSString *newString) {
     @strongify(self);
     self.bt.enabled = [newString hasPrefix:@"Success"];
 }];


RAC(self,self.warningText) = [RACSignal combineLatest:@[
RACObserve(self,self.input.text),RACObserve(self, self.verifyInput.text)]
reduce:^(NSString *password, NSString *passwordConfirm)
{
    if ([passwordConfirm isEqualToString:password])
    {
        return @"Success";
    }
    else if([password length] == 0 || [passwordConfirm length] ==0 )
    {
        return @"Please Input";
    }
    else
    return @"Input Error";
}
  ];

对应关系如下图所示

学过C++ 的应该觉得这个很类似于Qt中的信号槽机制

需要说明的是因为RAC很大程度上是依赖于Block的.所以在RAC前面我们加上@weakify(my_variable) 避免循环引用,然后在每一个
RAC块中为了防止提前释放我们需要用@strongify(my_variable)来对对象进行持有.详情点击

运行效果图如下


W本站文章如果没有特殊说明,均为原创,转载请以链接方式注明本文地址: http://hufeng825.github.com/2013/10/13/ios31/

相关文章:

  • Webservice-XML与Java(五)
  • Java中SimpleDateFormat用法详解
  • Parcelable protocol requires a Parcelable.Creator object called。。。。。
  • MOTOROLA MC40 android系统扫描开发
  • cocos2d-x开启IOS多点触控
  • android友盟注意事项
  • Android编程之Intent源码详解
  • Android编程之LocalBroadcastManager源码详解
  • Android编程之DialogFragment源码详解(一)
  • Android编程之DialogFragment源码详解(二)
  • 在Mac上配置cocos2d-x 3.0,xcode5资源无法刷新的问题
  • 在Mac上配置cocos2d-x 3.0的Android开发环境
  • cocos2d-x 3.0的lua-binding接口导出
  • Sublime Text 3技巧:支持GB2312和GBK编码
  • android Ant 批量多渠道打包 总结!
  • Android优雅地处理按钮重复点击
  • gitlab-ci配置详解(一)
  • javascript 总结(常用工具类的封装)
  • JavaScript新鲜事·第5期
  • Java多态
  • Java教程_软件开发基础
  • mysql 5.6 原生Online DDL解析
  • React 快速上手 - 07 前端路由 react-router
  • Vue2.x学习三:事件处理生命周期钩子
  • windows下mongoDB的环境配置
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 开源SQL-on-Hadoop系统一览
  • 三分钟教你同步 Visual Studio Code 设置
  • 数组的操作
  • 学习HTTP相关知识笔记
  • 责任链模式的两种实现
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • $.ajax中的eval及dataType
  • ${ }的特别功能
  • (2)nginx 安装、启停
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (c语言)strcpy函数用法
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (二)Linux——Linux常用指令
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (一)Linux+Windows下安装ffmpeg
  • (一)SpringBoot3---尚硅谷总结
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • ... 是什么 ?... 有什么用处?
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core WebAPI中封装Swagger配置
  • .NET Standard 的管理策略
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net 程序发生了一个不可捕获的异常