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

        }];

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

时间: 2024-10-29 19:07:07

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

Objective-c中的Block(块)详解

Block初探 在Objective-c中NSArray是很常用的容器之一,很多时候我们需要对数组中的数据进行排序,因此与下面类似的代码会经常碰到: NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { if ([obj1 integerValue] > [obj2 integerValue]) { return (NSComparisonResult)NSOrderedDescending

详解java动态代理

生活中的代理: 比如一个明星成名了以后,是需要有一个代理的,因为太多人想找他签名,应付不来,那么这个时候代理的作用是拦截你对真正明星的访问,他可以拦截下来收点费用,再叫真正的明星过来为你签名. 程序中的代理: 1,要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理.等等,你准备如何做? 2,编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码 下图显示了在程序中代理的调用原理(

玩转 IOS 开发 - block 使用详解

1. block作用: Block用来封装一段代码,可以在任何时候执行: Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 苹果官方建议尽量多用block.在多线程.异步任务 .集合遍历.集合排序.动画转场用的很多 2. Block的定义: int (^MySum)(int, int) = ^(int a, int b) { return a+b; }; 如上面代码定义了一个叫MySum的blocks对象,它带有两个int参数,返回int.等式右边就 是blocks

Linux系统inode和block知识详解

1. inode和block概述 在每个Linux存储设备或存储设备的分区被格式化(ext3,ext4等)之后,一般都有两部分:一部分是inode,另一部分是block.block是用来存储实际数据的,而inode用来存储这些数据的属性信息,包括文件的大小.属主.归属的用户组.读写权限.文件类型.修改时间,还包含指向文件实体的指针功能(inode节点到block的对应关系)等,但并不包含文件名.文件名一般被存储在其所在目录的block里面. inode除了记录文件属性信息外,还会为每个文件进行信

细说Spring——AOP详解(动态代理实现AOP)

前言 嗯,我应该是有一段实现没有写过博客了,在写完了细说Spring——AOP详解(AOP概览)之后,我发现我不知道该怎么写AOP这一部分,所以就把写博客这件事给放下了,但是这件事情又不想就这么放弃,所以今天我仔细思考了一下,决定还是要克服困难,我仔细的想了一下怎么讲解AOP实现这一部分,然后我决定由浅入深的讲解动态代理,然后用动态代理实现一个简单的AOP,感觉这样能够让人对AOP的原理有一个比较深刻的认识,希望能帮到大家.而且最近学习又组建了ACM比赛的队伍,虽然已经要大三了,按理来说应该一心

Nginx详解(正向代理、反向代理、负载均衡原理)

nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现. 这里主要通过三个方面简单介绍nginx 反向代理 负载均衡 nginx特点 1. 反向代理 关于代理 说到代理,首先我们要明确一个概念,所谓代理就是一个代表.一个渠道: 此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问

iOS开发-语法篇-block详解

一:基本定义 /*初步上式block定义的一些理解和解释,接下来会详解: *block名为myBlock,结合C的函数指针,myBlock为block体的指针,指向block体的入口地址 *int result = myBlock(5) <==> ^(int num){return num*num}(5)//将5传给num *回调时可以将myBlock作为参数传入,也可以直接传入block体^(int num){…};// *整个block体作为参数传入时,往往没有参数,只是进行延迟运算作用,

MongoDB系列教程(八):GridFS存储详解

MongoDB系列教程(八):GridFS存储详解 GridFS简介 mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoDb会提供了一种处理大文件的规范--GridFS. GridFS实现原理 在GridFS数据库中,默认使用fs.chunks 和fs.files来存储文件,其中fs.files集合存放文件的信息,fs.chunks存放文件的数据,一

轻量级高可用实现工具--keepalived详解

一 .keepalived简介 keepalived:它的诞生最初是为ipvs(一些服务,内核中的一些规则)提供高可用性的,最初最主要目的是能够自主调用ipvsadm来生成规则,并且能够自动实现将用户访问的地址转移到其他节点上进行实现的. keepalived:核心包含两个ckechers和VRRP协议. ckeckers #检查服务检查reserved的健康状况的,基于脚本也可以服务本身的健康状况.这里是实现ipvs后端健康状况的检测的. VRRP # Virtual Router Redun