RAC框架源码解析之Block的使用

1、简介

RAC是ReactiveCocoa的简称,是一个结合了函数式编程和响应式编程的框架,在我们开发中常用到的 delegate、selector、block 都得到支持,当然了,这些都只是一些常见的基本的用法,我会从0到1解析RAC源码并说明RAC的原理,我们在学习RAC框架之前先来了解一些基本的block知识。

2、block

2.1、block有什么作用

  1. 提高代码的聚合性(不像代理)
  2. 可以作为对象的属性
  3. 可以作为方法的参数
  4. 可以作为返回值

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 

@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 

@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 

@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

你可能感兴趣的:(RAC框架源码解析之Block的使用)