Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。
Block是Apple Inc.为C、C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包。
闭包就是能够读取其它函数内部变量的函数。就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果。所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性。
不像代理声明了一个代理函数,在调用的类内部还要实现该函数,让人莫名惊诧,若一个页面能发送多个请求,并且用多点触控同时触发发送多个请求,那个这个页面的代理函数很难区分是那个请求的结果,胡乱解析消息很容易崩溃。有人说我发送一个请求就起个菊花,消息不返回,不让发其他请求。告诉你这个行不通,原因是弹出菊花是起一个线程,调用起线程很快会返回成功,但是你起的线程被加入主线程并且实际运行起来是需要时间的,大约需要130毫秒,并且那个提示菊花提示框也是刷新UI线程才出来的。所以当你两个手指同时点击两个发送请求或切换也页面的按钮时,在当点吉第一个按钮并起菊花,但是在菊花出现前的点击了另一个按钮时,那么你就连续发送了两个请求了。那么你用代理实现时就很难分出那个消息,只有你的响应消息中带有消息类型可能会分出来,若服务器做的不够强大,当出现异常时,找不发送请求,给你来个通用错误响应消息,你只有傻眼了。这样多个消息在一个函数里解析也不利于封装。
BLOCK最典型的是大所周知的AFNETWORK第三方库。它能解决发送函数找到自己对应的响应消息。代理方面的典型例子见我的文章《自己实现异步发送请求和图片》:http://blog.csdn.net/jia12216/article/details/47043935。
BLOC首先你在.h文件中声明BLOC对象,当然返回的参数你可以自己定义:
typedef void (^RequestCompletionBlocks)(NSDictionary *result,BOOL successed);
typedef void (^SocketLineSuccessBlocks)(BOOL successed);
typedef void (^SocketLineFailedBlocks)(BOOL successed);
@property (nonatomic,weak) RequestCompletionBlocks myblock; //block返回参数
@property (nonatomic,weak) SocketLineSuccessBlocks socktlineSuccessBlock; //成功连接
@property (nonatomic,weak) SocketLineFailedBlocks socktlineFailedBlock; //失败连接
-(void)socketConnectHost:(SocketLineSuccessBlocks)onSuccesscpmlention
failCompltion:(SocketLineFailedBlocks)onfailCompltion// socket连接
在.m文件中实现该函数就可以了
// socket连接
-(void)socketConnectHost:(SocketLineSuccessBlocks)onSuccesscpmlention
failCompltion:(SocketLineFailedBlocks)onfailCompltion// socket连接
{
//这个存储发送请求对象和响应请求对象到全局变量中
self.socktlineSuccessBlock = onSuccesscpmlention;
self.socktlineFailedBlock = onfailCompltion;
//这个是调用了另一个BLOCK函数
[[checkReachability sharedCheckReachability] checkReachability:^(NetworkStatus status) {
if (status == NotReachable)
{
//无网络返回失败
onfailCompltion(NO);
}
else
{
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
[self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:-1 error:&error];
//请求响应的成功消息在另一个socket线程函数里返回
}
}];
}
//请求响应的成功消息在socket线程函数里返回
pragma mark - 连接成功回调
- (void)socket:(GCDAsyncSocket )sock didConnectToHost:(NSString )host port:(uint16_t)port
{
//后台也能用
// [self.socket performBlock:^{
// self.socket.enableBackgroundingOnSocket = YES;
// }];
NSLog(@”socket连接成功”);
STATUS = Socketonline;
self.socktlineSuccessBlock(YES);
self.readhead = YES;
[self.socket readDataToLength:10 withTimeout:-1 tag:1];
}
BLOCK函数的调用大家都知道吧:
// 服务器掉线,重连
[self socketConnectHost:^(BOOL successed) {
if(successed)
{
//服务返回成功时的处理
}
else
{
//服务器返回的处理失败的处理
}
} failCompltion:^(BOOL successed) {
//异常时的处理,通常指非服务器返回的异常
}];
版权声明:本文为博主原创文章,未经博主允许不得转载。