iOS中得block代码块的定义及使用
现在的无论是框架还是项目中,越来越多的使用block代码块。
个人觉得:第一可以使代码看起来更简单明了,第二可以取代以前的delegate使代码的逻辑看起来更清晰。
借一张图表达基本定义:
(1)最基础的用法案例,可以把block理解为一段类似变量一样的可执行函数代码片段:
- void (^printBlock)(NSString *x);
- printBlock = ^(NSString* str)
- {
- NSLog(@"print:%@", str);
- };
- printBlock(@"hello world!");
(2)由于是变量,所以比方法等可以更灵活的使用,因为可以把block当做一个变量传入到另一个方法。
- - (void)viewDidLoad {
- [super viewDidLoad];
- NSLog(@"我在玩手机");
- NSLog(@"手机没电了");
- [self chargeMyIphone:^{
- NSLog(@"去逛街");
- }];
- NSLog(@"我在看电视");
- }
- -(void)chargeMyIphone:(void(^)(void))finishBlock {
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(110 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- NSLog(@"电充好了");
- finishBlock();
- });
- }
(3)上述方法是在单个类中执行的,如果在两个类中使用就能更加显现出其功能。可以用来取代代理,可以是逻辑变得清晰。如此处模拟一个发送HTTP请求的类。
- #import <Foundation/Foundation.h>
- typedef void(^HttpSendBlock)(NSDictionary *dict);
- @interface HttpReq : NSObject
- -(void)sendHttpReqUseUrl:(NSString*)url withBlock:(HttpSendBlock) block;
- @end
- #import "HttpReq.h"
- @implementation HttpReq
- -(void)sendHttpReqUseUrl:(NSString*)url withBlock:(HttpSendBlock) block{
- //……………发送请求并获取返回结果……………
- NSDictionary *dic = [[NSDictionary alloc]initWithObjects:[NSArray arrayWithObjects:@"name",@"state", nil nil] forKeys:[NSArray arrayWithObjects:@"wdl",@"ok", nil nil]];
- //返回请求结果
- block(dic);
- }
- @end
在一个Controller调用发送HTTP请求。
- - (void)viewDidLoad {
- [super viewDidLoad];
- HttpReq *req = [[HttpReq alloc]init];
- [req sendHttpReqUseUrl:@"www.baidu.com" withBlock:^(NSDictionary *dict) {
- NSLog(@"dict : %@",dict.description);
- }];
- }
看起来比较清晰,如果使用delegate的形势就相对比较繁琐一些,需要定义@optional,需要引用代理,实现代理,通过代理将结果返回回来。
iOS中得block代码块的定义及使用相关推荐
- Block代码块中使用局部变量注意点
第一次写代码遇到报这个错,实在是想不通为什么,按常理应该是不会有问题,报错的呀??纠结了一会之后只好仔细查看报错原因咯,原来是: 当我们在block代码块中使用局部变量时,就会很容易出现如图的错误. ...
- [ios开发基础之]代码块
iOS4引入了一个新特性,支持代码块的使用, 这将从根本上改变你的编程方式.代码块是对C语言的一个扩展,因此在Objective-C中完全支持.如果你学过Ruby,Python或Lisp编程 语言,那 ...
- C语言块级变量:在代码块内部定义的变量
所谓代码块,就是由{ }包围起来的代码.代码块在C语言中随处可见,例如函数体.选择结构.循环结构等.不包含代码块的C语言程序根本不能运行,即使最简单的C语言程序(上节已经进行了展示)也要包含代码块. ...
- java代码块的定义_Java几种代码块的定义与常见问题
Java几种代码块的定义与常见问题 代码块,通俗的说就是用一对"{}"括起来的一段代码,代码块可以根据位置分为以下几类: 局部代码块:局部代码块就是指直接在方法或是语句中定义的代码 ...
- Java中构造函数,静态代码块,构造代码块的执行顺序
静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...
- java构造块_java中的静态代码块、构造代码块、构造方法详解
运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...
- CSDN博客中删除空白代码块
在我们编写CSDN博客的时候,有时候我们创建了一些代码块然后删去时,会出现在博客中还有空白代码块出现的情况,比如我自己写的这个博客: 而我们在编辑模式修改时是看不到这个空白代码块的: 那我们应该如何删 ...
- react方法返回html_#react# 在页面中显示html代码块
在页面中显示html代码块 在网上查了下,说有一下方法可以把html代码直接在页面中输出. textarea 不让编辑 去边框 去滚动条 直接把代码用ps做成图片上传到网页 用转换符号 在jsx中前面 ...
- MarkDown中插入的代码块无法自动识别换行
MarkDown中插入的代码块无法自动识别换行 1.插入代码块的两种方式 单行的代码,就一个 ` 多行的代码块就三个```补充说明,可根据自己编写代码块的语言,设定对应的标签(比如Java-java, ...
最新文章
- Opera 60 正式发布,代号 Reborn 3
- axios 一些用法总结
- 内网渗透测试:内网信息收集与上传下载
- java集群调度_Cuckoo-Schedule
- 函数计算自动化运维实战 3 -- 事件触发自动创建快照
- java 日志框架 详解_java日志框架系列(9):logback框架过滤器(filter)详解
- 如何用Fiddler对手机(安卓/iOS)数据进行抓包
- html手机页面怎么长按不出复制,HTML -----对于手机页面长按会粘贴复制的禁用
- html语言考点,HTML知识点
- 三种基于感知哈希算法的相似图像检索技术
- C++ boost 正则表达式用法
- java为什么要连接Mysql_为什么要启动mysql workbech,java才能连接mysql数据库呢?
- 广州地铁公厕(洗手间)和母婴室信息汇总
- [QCTF2018]X-man-Keyword
- Python实现的简易HTTP代理服务器
- 形式化方法课程学习笔记(一)|Cop的安装以及简单使用
- 权限管理系统设计——入门(一)
- 信息系统基础知识---信息系统工程
- rem与px之间的转换
- 【更新于12.29】深度学习论文汇总
热门文章
- 怎么跑都不累?自然医学揭秘微生物组提升运动表现
- PICRUSt2:OTU或ASV等16S随便预测宏基因组且数据库增加10倍
- 宏基因组学习交流5群成立
- python使用matplotlib可视化、使用annotate函数以及arrowprops参数在可视化图像中添加箭头和文本注释(arrow and text annotation)
- R语言manova函数进行多元方差分析(Multivariate analysis of variance 、MANOVA)、如果多变量检验结果有显著性,summary.aov函数锦欣单变量方差分析
- R语言可视化包ggplot2包移除可视化图形的轴标签(刻度及其对应数值)实战(Remove Axis Labels)
- 层次聚类(cluster.AgglomerativeClustering)并通过TSNE进行可视化分析
- linux bash字符串截取
- 无损卡尔曼滤波UKF与多传感器融合
- 基于半监督学习的单体型组装算法