[Objective-C] Block实现回调和简单的学习思考
初识Block的时候,总觉得其很可怕,因为看不懂其运行原理,所以用起来总是觉得不安全。关于Block的语法,等我把手里的资料全部看完,整理好再发出来。这次先看看用Block怎么实现回调。
新博客:wossoneri.com
关于Objective-C的回调,最常见的应该是用delegate代理实现。不过代理的实现比起Block要更基础,就不介绍了,下面总结一下Block回调的实现。
就拿我昨天才写的博客为例:[iOS] 输入框高度随输入内容变化
在昨天的例子中,我的组件封装控件后,是通过代理实现返回行数的变化的。这次改用Block来实现。
- 定义一个
Block类型,用来代替原来的@Protocol
typedef void(^getTextViewRows)(NSInteger lines);
- 在
interface中声明参数为Block的实例方法
- (void)textViewRowsChangeTo:(getTextViewRows)block;
- 实现
textViewRowsChangeTo:的方法
- (void)textViewRowsChangeTo:(getTextViewRows)block {
block(lines);
}
唉,等等,我应该返回的行数是在textViewDidChange:运行时获得后才返回的啊,这样写还回调个什么鬼。。
所以我们需要声明一个Block变量,保存从外部传进来的Block的地址,然后当我们获取到改变的行数后,再从这个地址把正确的内容返回。
在第2步添加声明Block变量
@property (nonatomic, strong) getTextViewRows b_getRowsBlock;
- (void)textViewRowsChangeTo:(getTextViewRows)block;
修改第3步
- (void)textViewRowsChangeTo:(getTextViewRows)block {
_b_getRowsBlock = block;
}
然后在需要返回行数的时候,把行数作为参数传给Block
- (void)textViewDidChange:(UITextView *)textView {
NSInteger numLines = textView.contentSize.height / textView.font.lineHeight;
if (numLines != rows) {
rows = numLines;
//发生换行
_b_getRowsBlock(rows);
}
......
}
最后,在外部调用前面的实例方法即可
B *b = [B new];
[b textViewRowsChangeTo:^(NSInteger lines) {
rowCount = lines;
[self remakeConstraint];
}];
最后,这又是一篇How to do的文章。说起来价值不算大。
但我觉得,想快速学一个新东西并且上手用起来,是需要从不断模仿别人写的代码做起的。
就像我第一次看代理,虽然了解大概实现过程,但用起来还是经常会出现忘写
XX.delegate = self这看似微不足道的代码的,导致的结果就是调试程序的时候发现代理不起作用,然后排查业务逻辑,看手势事件有没有捕捉到...到最后才会想到排查语法错误。一个小错误导致我效率低下。(这种错误其实是对代理实现原理理解的不够造成的,但对于新手,理解需要时间,而要快速上项目就需要熟记这个实现流程,然后通过大量编码的过程去参悟原理。)我想说的是,一般调试逻辑bug的时候很少会去想到语法错误,这就要求了我们平时写代码的时候要注意编程的细节,在学习的时候打好基础。有时候为了追求快速实现功能,可以不去深究,知道实现步骤就可以,比如说这个
Block回调,这篇文章就可以作为一个模板,每次用的时候都按照这个步骤去做可以保证不出错,可以快速出效果。照着这个写多了,熟练了就自然不会犯低级的语法错误,这对提升效率很有帮助。这也是为什么我坚持记录How to do的文章的原因。不过另外说起来,How to do的文章还有一个意义,那就是How to do都是有一个步骤顺序的,先干什么,再干什么。这个顺序就很有意义,它能提供一套解决问题的思路,也就是能看出这套语法的设计者是怎么去思考的。从设计者的思路去看语法就为我们后期深入学习理解相关知识提供了一条路子。当然了,具体能看到什么,学到什么还是看个人对编程的理解,也就是我所认为的编程心法。
好了,扯的有点偏,关于
Block回调快速上手的方法就是这样了,熟记这个步骤(千万别死记,编码是灵活的),多去敲代码,慢慢就会产生诸如"为什么要写_b_getRowsBlock = block;"的疑问,当产生疑问时,那就说明你熟悉并开始思考语法了。一定要思考,不然注定是当一辈子的码农,而不是程序员。关于
Block的内容还有很多。由于平时Block用的的确少,所以关于这部分的资料我还需要一些时间去消化。后面我会尽量多写Block,感受不同场景下的使用。最最后,我还记得几个月前我盯着代码发呆然后突然感叹一声:“原来这TM就是面向对象啊”的喜悦呢。(不是不懂,而是有了新的理解)
[Objective-C] Block实现回调和简单的学习思考的更多相关文章
- block学习二:使用Block替代回调
使用Block替代回调,分为三步进行:
- 【转】JS回调函数--简单易懂有实例
JS回调函数--简单易懂有实例 初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is ...
- TestNG简单的学习-TestNG运行
转载:http://topmanopensource.iteye.com/blog/1983735 TestNG简单的学习-TestNG运行 文档来自官方地址: http://testng.org/d ...
- Linux简单编程学习心得
在Linux环境下简单编程学习心得 linux编程过程 在上周的<信息安全设计基础>的课程学习中学习到了在虚拟的linux环境下简单的编程.学习过程中接触到了vim.gcc和gcd在实验楼 ...
- 20145217《网络对抗》 MAL_简单后门学习总结
20145217<网络对抗> MAL_简单后门学习总结 实践内容: 1.netcat的应用 2.socat的应用 3.meterpreter的应用 知识点学习总结 后门程序一般是指那些绕过 ...
- 【转】block一点也不神秘————如何利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
- [置顶] block一点也不神秘————如何利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
- 如何结合场景利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
- block一点也不神秘————如何利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
随机推荐
- 在matlab中实现PCA算法
function [V,S,E]=princa(X) [m,n]=size(X); %计算矩阵的行m和列n %-------------第一步:标准化矩阵-----------------% mv=m ...
- c++中double类型控制小数位数
有时,我们需要输出确定小数位数的double,可以先引入如下头文件: #include <iomanip> 然后通过下列方式输出: double zzz = 8.66666; cout & ...
- 关于 OpenIdConnect 认证启用 HTTPS 回调 RedirectUri 不生效问题
在搭建 IdentityServer 服务端后,我们尝试使用了 OIDC(OpenID Connect) 的中间件来代替了原先的 Session 系统认证方式,起初采用的是 HTTP 协议,一切都没有 ...
- SpringBoot + docker + neo4j
下拉镜像 docker pull neo4j 启动镜像 docker run -d -p 7473:7473 -p 7687:7687 -p 7474:7474 neo4j 打开浏览器:http:// ...
- Jenkins-pipeline的实现步骤
jenkins实现持续集成 搭建jenkins环境,安装插件 建立pipeline公用类库,文件夹vars,默认的 添加.groovy文件,可以由以下几个类库组成 dockerImageBuild 负 ...
- nginx服务器搭建以及配置
2019年第一篇博客,在新的一年祝大家新年快乐,技术更上一层楼. 今天在公司搞了好长时间的nginx服务器搭建,以及遇到的问题,总结一下,方便查询 这里使用的是百度云的服务器,CentOS7系统的 N ...
- unsigned/signed int/char类型表示的数值范围
一个32位的signed int类型整数表示的范围:-2^31~2^31-1 一个32位的unsigned int类型整数表示的范围: 0~2^32-1 一个8位的signed char类型整数表示的 ...
- 自然语言处理--LDA主题聚类模型
LDA模型算法简介: 算法 的输入是一个文档的集合D={d1, d2, d3, ... , dn},同时还需要聚类的类别数量m:然后会算法会将每一篇文档 di 在 所有Topic上的一个概率值p:这样 ...
- jQuery实用Demo
1.点击 隐藏/显示 元素 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- js设计模式总结3
1.模板方法模式 模板方法就是将多个模型抽象化归一,从中取出一个最基本的模板,当然这个模板可以作为实体对象也可以作为抽象对象,看你具体需求,其他模块只需要继承这个模块方法,也可以扩展这个方法. 举例子 ...