Block 基本使用介绍
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 基本使用介绍相关推荐
- 群体遗传 | haplotype block | HaploBlocker参数介绍
单倍型块( haplotype block )是连续基因组区域的一系列遗传变异位点的组合,这种基因组区域通常表现为高连锁不平衡.低重组. 但其实在育种过程中,情况可能更为复杂,我们观察到的haplot ...
- 【小程序】block标签的介绍和使用
转自:https://blog.csdn.net/qq_36530458/article/details/79778373 <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页 ...
- Enterprise Library 2.0 -- Caching Application Block
开始写Enterprise Library 2.0的学习体会,准备先把每个部分的入门部分写好,然后再继续深入的研究每一部分,希望能得到高手的指点和建议.今天写的是Enterprise Library ...
- Objective-C中的Block
1.Block定义 可以用一句话来表示Block:带有自动变量(局部变量)的匿名函数. 在iOS中使用"^"来声明一个Block.Block的内容是包含在"{}" ...
- Updater Application Block v1.0 翻译文档目录
为方便大家阅读有关Updater Application Block v1.0 的翻译文章,在本文中列出最近翻译的相关文章目录. Updater Application Block v1.0 介绍 U ...
- Linux查看网卡是rdma,Chelsio RDMA Block设备驱动测试
RDMA Block 设备驱动介绍 我们现在测试使用的 Chelsio T4 及 T5 系列万兆以太网卡支持 iWARP RDMA 功能,查阅文档之后发现此系列的万兆网卡除了支持常用的基于 IP 协议 ...
- 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
本文旨在总结iOS知识网络,知识点,该知识网络罗列出常见UIKit.Foundation的对象特点和一些使用经验,可以看成是一本书:文本编辑采用树的形式,对知识点进行罗列,并标注一些使用经验(★)希望 ...
- 群体遗传 | haplotype block | HaploBlocker使用
HaploBlocker是分析单条染色体haplotype blocks,这也很容易理解,haplotype block是同一条染色体的某些区域.因此,分析时,需要按染色体或者Scaffold切分VC ...
- AppCan开发框架详细介绍
1.UI2.0与UI1.0的对比 2012年初,我们发布了AppCan移动应用开发平台,在这个版本中,我们内置了基于JQMobile方案的CSS UI框架.这个框架可以帮助开发者遵循一套规则下,快速的 ...
最新文章
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
- 【300】◀▶ IDL - ENVI API
- CentOS 6.8 GRUB加密-修复和破解密码实战指南
- python示例库,常用的Python库和示例代码(快速上手)
- 分布式存储系统设计的几个问题和考虑点
- 九度题库(所有题目整理,适合计算机考研和面试的人用)
- Oracle查询忽略大小写的实现方法
- Cortex‐M3-总线接口
- 螺旋矩阵Python解法
- android 仿qq it蓝豹,《IT蓝豹》listview实现各种版面设计功能
- python中bool函数_bool()函数以及Python中的示例
- WinCE6 如何去掉控制面板中的应用?
- 01-python进阶-拾遗
- 时间序列模型matlab_平稳时间序列分析01---AR模型
- 用.NET编程风格实现Ajax——Atlas快速入门
- 最新的Sql笔试题及答案,部门表,用户表,客户信息表,订单表
- MATLAB绘制三维地图
- 标签thead与th的区别
- 游戏角色3d建模用什么软件
- 使用腾讯云sms实现短信验证功能