码迷,mamicode.com
首页 > 其他好文 > 详细

Block使用详解,Block与代理相比的优点

时间:2015-08-09 17:10:08      阅读:4489      评论:0      收藏:0      [点我收藏+]

标签:block的使用   block的优点   代理   多点触控   

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) {
             //异常时的处理,通常指非服务器返回的异常

        }];

版权声明:本文为博主原创文章,未经博主允许不得转载。

Block使用详解,Block与代理相比的优点

标签:block的使用   block的优点   代理   多点触控   

原文地址:http://blog.csdn.net/jia12216/article/details/47376847

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!