__block 变量
一般来说,在block内只能读取在同一个作用域的变数而且没有办法修改在block外定义的任何变数,此时若我们想要这些变数能够在block中被修改,就必须在前面挂上__block的修饰词,以上面第一个例子中的 multiplier 来说,这个变数在 block 中是唯读的,所以 multiplier = 7 指定完后,在 block 中的 multiplier 就只能是 7 不能修改,若我们在 block 中修改 multiplier ,在编辑时就会产生错误,因此若想要在 block 中修改 multiplier ,就必须在 multiplier 前面加上 __block 的修饰词,请参考下面的范例:
1: __block int multiplier = 7 ;
2: int (^myBlock)( int ) = ^( int num)
3: {
4: if (num > 5 )
5: {
6: multiplier = 7 ;
7: }
8: else
9: {
10: multiplier = 10 ;
11: }
12: return num * multiplier;
13: };
PS:简单的使用block进行网络请求回调,非常的方便,避免了delegate的繁琐
HttpRequest.h
//
// HttpRequest.h
// UseBlockCallBack
//
// Created by Michael on 2/13/14.
// Copyright (c) 2014 EIMS. All rights reserved.
//
#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
HttpRequest.m
//
// HttpRequest.m
// UseBlockCallBack
//
// Created by Michael on 2/13/14.
// Copyright (c) 2014 EIMS. All rights reserved.
//
#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:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
[requset setHTTPBody:[paramters dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:requset delegate:httpRequest];
NSLog(connection ? @"连接创建成功" : @"连接创建失败");
}
/**
* 接收到服务器回应的时回调
*/
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (!self.resultData) {
self.resultData = [[NSMutableData alloc]init];
} else {
[self.resultData setLength:0];
}
if ([response respondsToSelector:@selector(allHeaderFields)]) {
NSDictionary *dic = [httpResponse allHeaderFields];
NSLog(@"[network]allHeaderFields:%@",[dic description]);
}
}
/**
* 接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
*/
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.resultData appendData:data];
}
/**
* 数据传完之后调用此方法
*/
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *resultStr = [[NSString alloc]initWithData:self.resultData
encoding:NSUTF8StringEncoding];
if (self.finishBlock) {
self.finishBlock(resultStr);
}
}
/**
* 网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法
*/
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"network error : %@", [error localizedDescription]);
if (self.finishBlock) {
self.finishBlock(nil);
}
}
@end
在ViewController中调用:
[HttpRequest postRequestWithURL:@"http://www.baidu.com" paramters:@"" finshedBlock:^(NSString *dataString) { NSLog(@"finish callback block, result: %@", dataString); }];