iOS 学习Block小结

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-17 08:11   34   0
首先 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还是很方便很简单的。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP