第一次接触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同理