oc加入代码块的功能,可以将一块代码当做一个对象来看待,并且传递给其他方法或者函数。代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。脱字符(^)是代码块的语法标记。
下面封装了一个数据下载的代码块:
#import <Foundation/Foundation.h>
typedef void (^ReceiveResBlock)(NSURLConnection *connection, NSURLResponse *response);
typedef void (^ReceiveDataBlock)(NSURLConnection *connection, NSData *data);
typedef void (^ReceiveErrorBlock)(NSURLConnection *connection, NSError *error);
typedef void (^ConnFinish)(NSURLConnection *connection);
@interface MyConnection : NSObject<NSURLConnectionDataDelegate,NSURLConnectionDelegate>{
ReceiveResBlock _receiveResBlock;
ReceiveDataBlock _receiveDataBlock;
ReceiveErrorBlock _receiveErrorBlock;
ConnFinish _connFinishLoadingBlock;
}
+(MyConnection *)myConnectionWithReceiveRes:(ReceiveResBlock)receiveResBlock ReceiveDataBlock:(ReceiveDataBlock)receiveDataBlock ReceiveErroorBlock:(ReceiveErrorBlock)receiveErrorBlock ConnFinish:(ConnFinish)connFinishLoadingBlock;
-(id)initWithReceiveRes:(ReceiveResBlock)receiveResBlock ReceiveDataBlock:(ReceiveDataBlock)receiveDataBlock ReceiveErroorBlock:(ReceiveErrorBlock)receiveErrorBlock ConnFinish:(ConnFinish)connFinishLoadingBlock;
-(void)sendRequestWithURL:(NSURL *)url;
@end
#import "MyConnection.h"
@implementation MyConnection
-(id)initWithReceiveRes:(ReceiveResBlock)receiveResBlock ReceiveDataBlock:(ReceiveDataBlock)receiveDataBlock ReceiveErroorBlock:(ReceiveErrorBlock)receiveErrorBlock ConnFinish:(ConnFinish)connFinishLoadingBlock{
if (self = [super init]) {
_receiveResBlock = receiveResBlock;
_receiveDataBlock = receiveDataBlock;
_receiveErrorBlock = receiveErrorBlock;
_connFinishLoadingBlock = connFinishLoadingBlock;
}
return self;
}
+(MyConnection *)myConnectionWithReceiveRes:(ReceiveResBlock)receiveResBlock ReceiveDataBlock:(ReceiveDataBlock)receiveDataBlock ReceiveErroorBlock:(ReceiveErrorBlock)receiveErrorBlock ConnFinish:(ConnFinish)connFinishLoadingBlock{
MyConnection *conn = [[MyConnection alloc] initWithReceiveRes:receiveResBlock ReceiveDataBlock:receiveDataBlock ReceiveErroorBlock:receiveErrorBlock ConnFinish:connFinishLoadingBlock];
return conn;
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
_receiveResBlock(connection,response);
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
_receiveDataBlock(connection,data);
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
_receiveErrorBlock(connection,error);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
_connFinishLoadingBlock(connection);
}
-(void)sendRequestWithURL:(NSURL *)url{
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection connectionWithRequest:request delegate:self];
}
@end
在代码块中局部变量和全局变量的使用
代码块内的指令可以访问到其他代码都能够访问的全局变量,对于局部变量来说,如果在代码块中改变局部变量的话,需要在局部变量的前面加上关键字:__block(block前面是两个下划线)