对于block浅显理解

第一次接触block是在线程间通信。

一、简介block使用:

1.定义一个myBlock

void (^myBlock)() = ^

{

  2.定义block中需要执行内容

  NSLog(@"--------Block中执行的内容");

}

3.执行block

myBlock();

一般情况这三步是分开进行的。

*特殊处理 一般为防止没有给block中需要执行的内容赋值,一般做如下特殊处理

if(self.block) //首先判断block是否已经赋值

{

  self.block();

}

二、block用法进阶

1、定义一个block类型

typedef void(^downloadImageBlock)(UIImage *image);

2、定义一个block属性

@property (nonatomic, copy) downloadImageBlock downBlock; (block属性默认用copy,暂时理解为block默认放入栈中,copy后不会立即被释放,详细说明block深入解析分析)

3、block需要执行位置,如

   // 在子线程下载图片

UIImage *image = [self downloadImage];

// 回到主线程

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

// 更新图片

// 3. 执行这个Block

if (self.downBlock) {

// 3.执行Block

self.downBlock(image);

NSLog(@"执行Block中的内容: 设置图片");

}

}];

4、在下载图片前对block赋值

  

ITDownloadOperationBlock *op = [[ITDownloadOperationBlock alloc] init];

op.downBlock = ^(UIImage * image)

{

  //设置block需要执行的内容

  self.imageView.image = image;

}

三、block当作参数传递(暂时优点为 对block赋值时,只需要做相应操作,不需再思索block写法)

1、定义一个Block类型

// Block接收一个普通参数(UIImage)

typedef void (^downloadImageOperationBlock)(UIImage *image);

2、定义一个Block的属性

@property (nonatomic, copy) downloadImageOperationBlock downBlock;

3、 定义一个方法,负责传递Block

// (downloadImageOperationBlock)blk:把Block当做一个参数来传递

- (void)setUpImageWithBlock:(downloadImageOperationBlock)blk;

4、实现这个方法,self.downBlock赋值

-(void)setUpImageWithBlock:(downloadImageOperationBlock)blk

{

NSLog(@"定义op.downBlock内部执行的代码");

if (blk) {

// 给self.downBlock赋值(Block内部执行的方法)

self.downBlock = blk;

NSLog(@"给op.downBlock赋值(Block内部执行的方法)");

}

}

5、block需要执行位置,如

   // 在子线程下载图片

UIImage *image = [self downloadImage];

// 回到主线程

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

// 更新图片

// 3. 执行这个Block

if (self.downBlock) {

// 3.执行Block

self.downBlock(image);

NSLog(@"执行Block中的内容: 设置图片");

}

}];

6、在下载图片前对block赋值

  

ITDownloadOperationBlock *op = [[ITDownloadOperationBlock alloc] init];

// Block中的内容是一个参数

[op setUpImageWithBlock:^(UIImage *image) {

// 定义一个Block中执行的内容.

self.imageView.image = image;

NSLog(@"执行Block中的代码");

}];

*特殊 例子中传递的image为单一参数,如需要传递多参数,可直接传递self,只需将对应的属性传递给下个控制器即可,delegate同理

时间: 2024-10-19 23:35:46

对于block浅显理解的相关文章

谈谈对zynq的浅显理解

zynq并不能说是一个嵌入arm核的FPGA.从它的启动过程就可以发现,绝对是arm主导的,所以称它为以高性能FPGA为外设的双核arm或许更为合适.以下是优势: 第一个:开发环境的大集成.从hls到vivado到sdk,对于一个不熟悉FPGA的嵌入式软件工程师来说,完全可以把它当做简单的双核ARM,使用例程中搭建好的硬件环境,在sdk中开发.软件调试后发现某些算法太慢,速度上不去,可以用hls把这部分进行优化,由工具直接生成电路,甩到vivado中.一般情况下快个一二十倍是没问题的.所以,整个

费曼学习法的浅显理解

关于费曼学习法的浅显理解 概念: 费曼学习法是一种我正在使用的学习法,一个人A学到了或理解了一个自己以前接触或者没接触过的知识点B(理解的浅显含义:A通过B推出D结论)可以此人尽自己最大能力将这个知识点阐述于另外一个人C,C可以达到推出D结论地步.这是我的理解方式于费曼学习法 图示 关键 此学习法的关键在于三个词,简述 类比 迭代. 笔者自己得到的关键词组合便是,学习一次概念之后的结果,用简短的语言将知识点讲述出来,通过自己想起来简单的例子去形象化概念,听者听不懂的时候,对这个听不懂的地方进行查

iOS开发中Block的理解与使用

简介 我们可以把Block当做Objective-C的匿名函数.Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观.另外,block的实现具有封闭性(closure),而又能够很容易获取上下文的相关状态信息. block是代码块,其本质和变量类似.不同的是代码块存储的数据是一个函数体.使用Block,就可以像其他标准函数一样,传入参数,并得到返回值. block的格式: a:Block的返回值类型,可以为空(void); b:Block对象名称,可

关于重定位代码的浅显理解

首先需要朱有鹏老师,这是在学习了朱老师的课程之后的一点理解,代码是根据朱老师的源码学习之后编写的. 根据反汇编代码  d0024010:     e24f0018       sub      r0, pc, #24 可以看出通过adr汇编伪指令将加载地址写入r0寄存器,此时因为adr指令采用相对寻址的寻址方式所以adr实际写入r0寄存器的地址为程序的加载地址而非反汇编代码所指示的0xd0024000,通过ldr伪指令将所需重定位的地址写入r1寄存器,此时r1所存的地址为0xd0024064,该

关于Block的理解

代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 而且在iOS4之后,很多API都加入了Block作为参数适用,比如NSURLSessionDataTask中的complationHandler参数就是一个带有传入参数的block参数. block和一般的函数写法上区别不大,跟像是C/C++的函数写法,但唯一需要注意的是,在代码块外声明的变量,在block内是无法改变的,若想改变,必须加上  __bloc

对于block的理解

1.block跟swift中的闭包(closure)基本一样,都常用于值的回调,特别是在多线程的网络请求回调中,使用起来极为方便. 2.block的开头是"^",接着是由小括号所报起来的参数列,行为主体由大括号包起来.block有四种类型,分别是无参无返回.无参有返回.有参有返回.以及有参无返回,而一般使用的block都是有参block,因为使用block主要就是进行参数的传递. 3.使用block时要特别注意类的循环引用,例如在一个控制器中,self强指针指向一个对象,而这个对象又强

uboot初体验-----趣谈nand设备发起的浅显理解

1 选择Uboot版本号 2 移植uboot至console正常work 3 制造uImage和使用uboot指南 4 写NFC驱动器 5 uboot从nand启动引导系统 1 选择Uboot版本号 正所谓"工欲善其事,必先利其器".假设在整个过程中可以有一套友好的软硬件开发环境整个过程就比較顺利了. 戳中痛点-- 对于选择Uboot的版本号.一般人都会选择最新版本号.可是新版本号必定会有些结构上的差异.因此在选择好版本号之后,一定要细致分析一下如今的uboot  tree.然后选择合

委托 lambda表达式浅显理解

方法不能跟变量一样当参数传递,怎么办,C#定义了委托,就可以把方法当变量一样传递了,为了简单,匿名方法传递,省得再声明方法了:再简单,lambda表达式传递,比匿名方法更直观. public delegate int delegateArithmetic(int a, int b); //委托作为参数,方法传递给委托 public int result(int x,int y,delegateArithmetic delAri) { return delAri(x, y); } public i

spingAOP和IOC的浅显理解

AOP,顾名思义,是面向切面编程,相对于OOP来说,它提供声明式的事务管理,交叉功能模块化,从而把应用服务和业务逻辑完全分离. IOC就是传说中的控制反转,对象不需要主动查找.创建实例,而是由spring的容器来创建和注入依赖对象,客户端类因此不再主动创建这些对象.此时,应用程序不再去主动创建和注入对象,而是被动滴等待容器进行注入和创建.IOC实现了对象间的松藕,有利于功能复用.