iOS中得block代码块的定义及使用

来源:互联网 发布:绵阳编程培训学校 编辑:程序博客网 时间:2024/05/18 01:09
现在的无论是框架还是项目中,越来越多的使用block代码块。
个人觉得:第一可以使代码看起来更简单明了,第二可以取代以前的delegate使代码的逻辑看起来更清晰。

借一张图表达基本定义:


(1)最基础的用法案例,可以把block理解为一段类似变量一样的可执行函数代码片段:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. void (^printBlock)(NSString *x);    
  2. printBlock = ^(NSString* str)    
  3. {    
  4.     NSLog(@"print:%@", str);    
  5. };    
  6. printBlock(@"hello world!");    
(2)由于是变量,所以比方法等可以更灵活的使用,因为可以把block当做一个变量传入到另一个方法。

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. - (void)viewDidLoad {  
  2.     [super viewDidLoad];  
  3.     NSLog(@"我在玩手机");  
  4.     NSLog(@"手机没电了");  
  5.     [self chargeMyIphone:^{  
  6.         NSLog(@"去逛街");  
  7.     }];  
  8.     NSLog(@"我在看电视");  
  9. }  
[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.   

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. -(void)chargeMyIphone:(void(^)(void))finishBlock {  
  2.     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(110 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{  
  3.         NSLog(@"电充好了");  
  4.         finishBlock();  
  5.     });  
  6. }  



(3)上述方法是在单个类中执行的,如果在两个类中使用就能更加显现出其功能。可以用来取代代理,可以是逻辑变得清晰。如此处模拟一个发送HTTP请求的类。

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #import <Foundation/Foundation.h>  
  2.   
  3. typedef void(^HttpSendBlock)(NSDictionary *dict);  
  4.   
  5. @interface HttpReq : NSObject  
  6.   
  7. -(void)sendHttpReqUseUrl:(NSString*)url withBlock:(HttpSendBlock) block;  
  8.   
  9. @end  
[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #import "HttpReq.h"  
  2.   
  3. @implementation HttpReq  
  4.   
  5. -(void)sendHttpReqUseUrl:(NSString*)url withBlock:(HttpSendBlock) block{  
  6.     //……………发送请求并获取返回结果……………  
  7.     NSDictionary *dic = [[NSDictionary alloc]initWithObjects:[NSArray arrayWithObjects:@"name",@"state", nil nil] forKeys:[NSArray arrayWithObjects:@"wdl",@"ok", nil nil]];  
  8.       
  9.     //返回请求结果  
  10.     block(dic);  
  11. }  
  12.   
  13. @end  
在一个Controller调用发送HTTP请求。

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. - (void)viewDidLoad {  
  2.     [super viewDidLoad];  
  3.     HttpReq *req = [[HttpReq alloc]init];  
  4.     [req sendHttpReqUseUrl:@"www.baidu.com" withBlock:^(NSDictionary *dict) {  
  5.         NSLog(@"dict : %@",dict.description);  
  6.     }];  
  7. }  

看起来比较清晰,如果使用delegate的形势就相对比较繁琐一些,需要定义@optional,需要引用代理,实现代理,通过代理将结果返回回来。
0 0
原创粉丝点击