iOS 学习Block小结

首先  Block实体形式如下:

^(传入参数列){行为主题};

Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

例如下面的一个例子:

  1. ^(int a){return a*a;};
这是代表Block会回传输入值的平方值(int a 就是参数列 return a*a; 就是行为主体)。记得行为主体里最后要加“;”,因为是叙述,而整个{}最后也要加“;”,因为Block是物件实体。

举例,简单的使用Block进行网络请求回调,非常的方便,避免了delegate的繁琐

.h文件


#import <Foundation/Foundation.h>

 //重点在这里

typedef void (^FinishBlock)(NSString *dataString);

 

@interface HttpRequest :NSObject<NSURLConnectionDataDelegate>

 

@property (strong, nonatomic) NSMutableData *resultData;

 //重点在这里

@property (strong, nonatomic) FinishBlock finishBlock;

 

+ (void)postRequestWithURL:(NSString *)urlStr

                paramters:(NSString *)paramters

             finshedBlock:(FinishBlock)block;

 

@end


.m文件

#import"HttpRequest.h"

@implementation HttpRequest

+ (void)postRequestWithURL:(NSString *)urlStr

                paramters:(NSString *)paramters

             finshedBlock:(FinishBlock)block

{

    HttpRequest *httpRequest = [[HttpRequest alloc]init];

   httpRequest.finishBlock = block;

   

    NSURL *url = [NSURL URLWithString:urlStr];

   NSMutableURLRequest *requset =[[NSMutableURLRequest alloc]initWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];

    [requsetsetHTTPBody:[paramters dataUsingEncoding:NSUTF8StringEncoding]];

   

    NSURLConnection*connection = [[NSURLConnectionalloc]initWithRequest:requset delegate:httpRequest];

   NSLog(connection ? @"连接创建成功" : @"连接创建失败");

}

/**

 *  接收到服务器回应的时回调

 */

- (void)connection:(NSURLConnection *)connectiondidReceiveResponse:(NSURLResponse *)response

{

   NSHTTPURLResponse *httpResponse =(NSHTTPURLResponse *)response;

    if (!self.resultData){

       self.resultData = [[NSMutableDataalloc]init];

    } else {

       [self.resultData setLength:0];

    }

   

    if ([responserespondsToSelector:@selector(allHeaderFields)]) {

       NSDictionary *dic = [httpResponseallHeaderFields];

        NSLog(@"[network]allHeaderFields:%@",[dicdescription]);

    }

}

/**

 *  接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次

 */

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

   [self.resultData appendData:data];

}

/**

 *  数据传完之后调用此方法

 */

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    NSString *resultStr = [[NSStringalloc]initWithData:self.resultData

                                              encoding:NSUTF8StringEncoding];

//重点在这里

    if (self.finishBlock) {

       self.finishBlock(resultStr);

    }

}

/**

 *  网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法

 */

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

//重点在这里

    NSLog(@"network error : %@", [errorlocalizedDescription]);

    if (self.finishBlock) {

       self.finishBlock(nil);

    }

}

@end

 

ViewController中调用:

[HttpRequest postRequestWithURL:@"http://www.baidu.com"

                         paramters:@""

                      finshedBlock:^(NSString *dataString){

                          NSLog(@"finish callback block, result: %@", dataString);

}];

使用Block还是很方便很简单的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值