block在iOS中是一个神奇的存在,既像是面向过程的函数又像是面向对象的对象实例,实质上是一个匿名函数.如果能够很好的利用它就就可以很方面地控制数据流程,使代码结构更加清晰,逻辑实现更加明了易读.

1 如何定义一个Block

  • 直接在使用的地方定义

例如我们需要一个没有返回值没有参数的block:如果参数为空,后边的()可以省略.

void (^blockWithNoValueAndParameter)(void) = ^(){//code here do what you want
};
或者
void (^blockWithNoValueAndParameter)(NSString *) = ^{//code here do what you want};

或者需要一个有参数无返回值的block:

void(^blockWithNoValueBlock)(NSString *) = ^(NSString *str) {NSLog("content == %@", str);
};

或者有参数有返回值的block:

NSString *(^block)(NSString *) = ^NSString *(NSString *str) {NSString *_str = str;if (![_str hasPrefix:@"_aspects_"]) {_str = [@"_aspects_" stringByAppendingString:_str];}return _str;
};
  • 使用typedef预先定义block
        typedef NSInteger (^GetLengthBlock)(NSString *);GetLengthBlock block = ^NSInteger(NSString *str){return str.length;};

可能有人注意到了,为什么在上边的定义中我们都使用了小写开头,而这里使用大些开头呢?这是因为typedef定义的是一个"类"(此时的GetLengthBlock相当于 NSInteger (^)(NSString *)  这个结构),而不是一个具体的block,而上边我们只是定义一个具体的block(相当于 (NSInteger (^)(NSString *))block),虽然看起来差不多,但事实上代表的意义是不一样的.

2. Block的使用场景

2.1  作为属性进行传值

例如我们可以在一个控制器中定义一个属性block,在给界面push之前定义block的实现,然后在该界面发生的事件就可以通过block进行回传.

@interface ViewController ()
//由于block绝大多数情况下会需要捕获外部变量,所以一般使用block修饰,将block从栈区copy到堆区,方便控制其生命周期
@property (copy, nonatomic) void(^sendValueBlock)(id);
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {if (self.sendValueBlock) {self.sendValueBlock(@"touch");}
}

注意:我们将block视为对象,由于block绝大多数情况下会需要捕获外部变量,所以一般使用block修饰,将block从栈区copy到堆区,方便控制其生命周期,防止其提前释放造成野指针异常.

2.2 作为参数进行回调

例如,AFNetworking中AFHTTPSessionManager中GET方式请求的数据回调,可以在需要的时候进行回调.

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLStringparameters:(nullable id)parametersprogress:(nullable void (^)(NSProgress *downloadProgress))downloadProgresssuccess:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))successfailure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

2.3 实现链式编程

可以通过定义属性block来实现函数的链式调用,例如著名的布局框架masnory就是借助于block实现的,我们这里制作简单的说明.例如我们做一个简单的加减法运算器:

@interface Calculator : NSObject
@property (assign, nonatomic) double result;
- (Calculator *(^)(double num))add;
- (Calculator *(^)(double num))sub;@end@implementation Calculator
- (Calculator *(^)(double num))add {return ^Calculator *(double num) {self.result  += num;return self;};
}
- (Calculator *(^)(double num))sub {return ^Calculator *(double num){self.result -= num;return self;};
}
@endCalculator *cal = [[Calculator alloc] init];cal.add(30).sub(3).add(23);

Block 基本使用介绍相关推荐

  1. 群体遗传 | haplotype block | HaploBlocker参数介绍

    单倍型块( haplotype block )是连续基因组区域的一系列遗传变异位点的组合,这种基因组区域通常表现为高连锁不平衡.低重组. 但其实在育种过程中,情况可能更为复杂,我们观察到的haplot ...

  2. 【小程序】block标签的介绍和使用

    转自:https://blog.csdn.net/qq_36530458/article/details/79778373 <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页 ...

  3. Enterprise Library 2.0 -- Caching Application Block

    开始写Enterprise Library 2.0的学习体会,准备先把每个部分的入门部分写好,然后再继续深入的研究每一部分,希望能得到高手的指点和建议.今天写的是Enterprise Library ...

  4. Objective-C中的Block

    1.Block定义 可以用一句话来表示Block:带有自动变量(局部变量)的匿名函数. 在iOS中使用"^"来声明一个Block.Block的内容是包含在"{}" ...

  5. Updater Application Block v1.0 翻译文档目录

    为方便大家阅读有关Updater Application Block v1.0 的翻译文章,在本文中列出最近翻译的相关文章目录. Updater Application Block v1.0 介绍 U ...

  6. Linux查看网卡是rdma,Chelsio RDMA Block设备驱动测试

    RDMA Block 设备驱动介绍 我们现在测试使用的 Chelsio T4 及 T5 系列万兆以太网卡支持 iWARP RDMA 功能,查阅文档之后发现此系列的万兆网卡除了支持常用的基于 IP 协议 ...

  7. 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)

    本文旨在总结iOS知识网络,知识点,该知识网络罗列出常见UIKit.Foundation的对象特点和一些使用经验,可以看成是一本书:文本编辑采用树的形式,对知识点进行罗列,并标注一些使用经验(★)希望 ...

  8. 群体遗传 | haplotype block | HaploBlocker使用

    HaploBlocker是分析单条染色体haplotype blocks,这也很容易理解,haplotype block是同一条染色体的某些区域.因此,分析时,需要按染色体或者Scaffold切分VC ...

  9. AppCan开发框架详细介绍

    1.UI2.0与UI1.0的对比 2012年初,我们发布了AppCan移动应用开发平台,在这个版本中,我们内置了基于JQMobile方案的CSS UI框架.这个框架可以帮助开发者遵循一套规则下,快速的 ...

最新文章

  1. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
  2. 【300】◀▶ IDL - ENVI API
  3. CentOS 6.8 GRUB加密-修复和破解密码实战指南
  4. python示例库,常用的Python库和示例代码(快速上手)
  5. 分布式存储系统设计的几个问题和考虑点
  6. 九度题库(所有题目整理,适合计算机考研和面试的人用)
  7. Oracle查询忽略大小写的实现方法
  8. Cortex‐M3-总线接口
  9. 螺旋矩阵Python解法
  10. android 仿qq it蓝豹,《IT蓝豹》listview实现各种版面设计功能
  11. python中bool函数_bool()函数以及Python中的示例
  12. WinCE6 如何去掉控制面板中的应用?
  13. 01-python进阶-拾遗
  14. 时间序列模型matlab_平稳时间序列分析01---AR模型
  15. 用.NET编程风格实现Ajax——Atlas快速入门
  16. 最新的Sql笔试题及答案,部门表,用户表,客户信息表,订单表
  17. MATLAB绘制三维地图
  18. 标签thead与th的区别
  19. 游戏角色3d建模用什么软件
  20. 使用腾讯云sms实现短信验证功能

热门文章

  1. 最小生成树:Prim算法 /Kruskal算法(待深入复习理解)
  2. 初识AI,ML和DL关系
  3. 三阶贝塞尔曲线拟合圆弧的一般公式
  4. win10下anaconda、tensorflow-cpu以及tensorflow-gpu安装
  5. 支持Jolla,支持Linux,支持开放,支持互联,Jolla屌丝逆袭
  6. 【数据结构】代码重现
  7. 用计算机数字弹侧脸,侧脸钢琴简谱-数字双手-于果
  8. 用C语言编制查询某班同学的平均成绩
  9. 数据资产管理实践白皮书(6.0版)解读
  10. 我太南了、996、保温杯里泡枸杞等成为2019年职场关键词