^(传入参数列){行为主题};
Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。
例如下面的一个例子:
- ^(int a){return a*a;};
举例,简单的使用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还是很方便很简单的。