1、简介
RAC是ReactiveCocoa的简称,是一个结合了函数式编程和响应式编程的框架,在我们开发中常用到的 delegate、selector、block 都得到支持,当然了,这些都只是一些常见的基本的用法,我会从0到1解析RAC源码并说明RAC的原理,我们在学习RAC框架之前先来了解一些基本的block知识。
2、block
2.1、block有什么作用
- 提高代码的聚合性(不像代理)
- 可以作为对象的属性
- 可以作为方法的参数
- 可以作为返回值
2.2、如何定义block
block其实只是一个变量而已,但是对于不经常使用block的开发者可能对于声明就有点头痛,在Xcode中输入 inlineBlock 可快速创建一个block,显示如图,这是Xcode自带的一个代码块,声明block对于的是 返回值 (^block名称) (参数) = (回调参数) { 执行的代码块 }
//快捷键inlineBlock
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
<#statements#>
};
//声明block
void(^JMBlock)() = ^() {
NSLog(@"JMBlock");
};
//调用block
JMBlock();
2.3、block如何作为对象的属性
新建一个Dog类,声明一个block,说到声明,会碰到在开发中很纠结的问题,声明block时该用 strong 还是 copy 。注意: 在ARC模式下用 strong ,但是在非ARC的情况下就必须用 copy。
在Dog类中声明block属性
#import <Foundation/Foundation.h>
@interface Dog : NSObject
/** block属性 */
@property (nonatomic, strong) void (^block)();
@end
在控制器中引用Dog并调用属性
//初始化
Dog *d = [[Dog alloc] init];
//调用Dog中的block属性
d.block = ^{
NSLog(@"我被调用了");
};
2.4、block如何作为对象的参数
在Dog类中声明一个带参数方法
#import <Foundation/Foundation.h>
@interface Dog : NSObject
/** 声明带参数的block */
- (void)sleep:(void(^)(NSString *))block;
@end
在Dog类中实现该方法
#import "Dog.h"
@implementation Dog
- (void)sleep:(void (^)(NSString *))block {
block(@"睡觉");
}
@end
在控制器中引用Dog并调用方法
//初始化
Dog *d = [[Dog alloc] init];
//调用方法
[d sleep:^(NSString * x) {
NSLog(@"狗狗在%@",x);
}];
2.5、block如何作为返回值
在Dog类中声明一个带返回值的block参数
#import <Foundation/Foundation.h>
@interface Dog : NSObject
/** block作为返回值 */
- (void(^)(int))run;
@end
在Dog类中实现该block
#import "Dog.h"
@implementation Dog
- (void (^)(int))run {
return ^(int m){
NSLog(@"开始运行第%zd次", m);
};
}
@end
在控制器中调用带返回值的方法
#import "ViewController.h"
#import "Dog.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//初始化
Dog *d = [[Dog alloc] init];
//block作为返回值
d.run(666);
}
@end
demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo
联系我:
qq: 1245424073
微信: liujunmin6980
网友评论