码迷,mamicode.com
首页 > 其他好文 > 详细

对于block浅显理解

时间:2015-12-13 23:30:42      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

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

对于block浅显理解

标签:

原文地址:http://www.cnblogs.com/QDDmacs/p/5043740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!