Understanding and Using RACCommand

RACCommand是我们新的好朋友吗?

RACCommand是ReactiveCocoa的一个基础模块,如果能够利用好它,不但能够节省你很多编码时间,还可以让你的iOS或者OS X应用更加健壮。

对于那些刚刚接触ReactiveCocoa(往下都会简称为RAC)的人,都不是很了解RACCommand如何工作和何时该使用它。官方文档中没有给出很多关于如何使用RACCommand的例子,只是在头文件中加入了很多注释。但是对于刚接触RAC的人来说,单通过这些注释,是很难真的理解的。因此我觉得有必要写一篇短文来介绍一下RACCommand,来让大家更好地理解它。

注:本文由爱飞翔的猪坚强译自ReactiveCocoa Essentials: Understanding and Using RACCommand

本篇博客中使用的代码都可以在githubhttps://github.com/olegam/RACCommandExample上获得。

RACCommand类是用来管理操作的执行。通过UI上,用户通常可以触发一些操作,比如用户点击的一个按钮。通过配置RACCommand实例就可以控制这些操作何时可以进行。这可以很容易地就可以绑定到UI上,并且这些命令可以确保操作在不被允许的时候不会执行。关于决定一个操作什么时候可以执行,常用的策略是将allowsConcurrentExecution设置为它的缺省值No。这会让这个操作不会被执行(如果这个操作已经在执行,则这次执行结束之后不会再被执行)。操作执行的结果会用RACSignal来表示,因此可以结合next:complete或者error:来一起使用。

示例程序

假设我们正在开发一款简单的iOS应用,这个应用可以让用户往一个邮件列表加入自己的邮件地址。在这个简单的表格中,我们会有一个文本框和一个按钮。当用户输入他的邮件地址,并且点击订阅按钮,那他的邮件地址就应该发送到某个网络服务。一个很简单的例子。但是,为了提供好的用户体验,我们需要考虑到一些情况。如果用户连续两次点击了按钮,会怎样呢?如何处理可能发生的错误呢?如果邮件地址是无效的呢?RACCommand可以帮助我们来处理这些问题。我已经实现的一个简单的应用来进行演示。

example