Block 的 基础 封装方法中遇到的block问题

用 block传值首先要知道  block  的执行顺序然后是block 的 方法 

在函数执行过程中通常要封装很多方法类   . 当要用到这个类的时需要将封装函数里 得到的数据传回来这就涉及传值的问题
通常我们可以用协议和 block 的方法传值


block  方法传值


 1>首先要宏定义
  
      typedef void (^DownloadBlock) (NSDate *data)   一般无返回值但是有参数 


2> 然后要在该类中声明一个 Block  的属性             定义这个属性的目的是为了接收在 主函数 中传入这个 类的 block 块

     @property (nonatomic , copy)  DownloadBlock   block    (注意:  使用 copy , DownloadBlock 后面没有 * 号 )


3> 要在该类的  .m 文件中重写dealloc的方法

        -(void)dealloc
        {
         Block_release(_block);
         [super dealloc];
         }                                                            (注意: block 的 释放方法 Block_release(_block);  )
   

4> 在该类的 .m 文件中 找到 block 的执行时刻一般来说执行时刻就是拿到 block 参数的时刻  例如: 文件解析 拿到 data的时候 . 再调用这个方法

          self.block(data); 

5> 然后就可以再 你需要的时候将这方法这个类导入你的头文件来使用这个方法以达到 你使用这个类的目的
例如  你在加载图片的时候就可以使用 这个方法进行异步加载


                   a. 要在函数中创建一个该类的对象 (包括 初始化  等);
                   b. 使用这个对象来来调用 这个方法  (一定 是 该类的 对象 来 调用)

6> 结束  



现在 通过具体的情景来解一下  

                           在一个工程里你要加载一些网络图显示在不同的 UIImageView 上怎么做?   
                           当然我们可以在工程下面写一个方法来做,  但是要是其他工程也需要这个方法呢? 所以我们要封装该方法,
                           在你需要的时候调用 就行

#1
首先我们要在该类中写一个方法也是创建该类的目的 "解析数据 ".这里只给出 方法名



   -(void)downloadImageWithURLString(NSString *)urlStr



#2
然后   数据解析出来了但是我们要怎样把这个解析出来的数据也就是 data  传到你要 的 地方 

所以 :  a.     代理
           b.     block


b. block
然后我们按上面的方法来在这个类中 .  1> 宏定义    2>写个属性    3>dealloc

                  typedef void (^DownloadBlock) (NSDate *data)

                  @property (nonatomic , copy)  DownloadBlock   block

首先我们想一个 “-“ 号方法

要初始化该类的对象.所以我们写一个初始化的方法,通过传入的图片地址的字符串来 初始化

                   -(id)initWithImageURLString:(NSString  *)urlString;



我们在初始化的时候直接调用了这个图片异步加载的方法

然后就可以在  -(void)downloadImageWithURLString(NSString *)urlStr  里找到数据加载的时候指定调用的时刻也就是箭头指定的位置


 我们就可以在自己想用的时候 


#3 我们在我们要用的函数中导入头文件   创建一个对象


ImageDownload *image = [ [ ImageDownload alloc ] initWithImageURLString:@“http://nefntng.jpg” ];

image.block = ^ (NSData *data){
             self.imageView.image = [ UIImage imageWithDate: data ];
            };


然后就可以了但是封装的不够完整 

所以借用一句话只要封不死就往死里封

还可以把block 这个当做参数直接 用;类 去 调用  
继续封

猜你喜欢

转载自blog.csdn.net/MR_worf/article/details/50211125
今日推荐