博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ios】使用Block对POST异步操作的简单封装
阅读量:6389 次
发布时间:2019-06-23

本文共 3179 字,大约阅读时间需要 10 分钟。

以下内容为原创,欢迎转载,转载请注明

来自天天博客:

一般情况下的POST异步操作需要实现以下几步:

1. 在controller.h上实现<NSURLConnectionDataDelegate>协议

2. 实现协议的几个方法,

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

3. 编写执行post请求的代码:

1 NSURL *url = [NSURL URLWithString:urlStr]; // 生成NSURL对象2     // 生成Request请求对象(并设置它的缓存协议、网络请求超时配置)3     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];4     5     [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; // 设置请求参数6     7     // 执行请求连接8     NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:executorDelegate];

 

如果controller有很多异步操作,处理就会很麻烦,而且,很多时候我们只需要处理完成和异常(比如超时)的时候的反馈即可

所以,我需要编写一个post请求的封装类,只要传入请求的url、请求参数(字符串形式)、完成时的回调block

首先,新建类:HttpPostExecutor,.h如下:

1 // 2 //  HttpPostExecutor.h 3 //  HttpTest 4 // 5 //  Created by WANGJIE on 13-11-6. 6 //  Copyright (c) 2013年 WANGJIE. All rights reserved. 7 // 8  9 #import 
10 11 @interface HttpPostExecutor : NSObject
12 {13 NSMutableData *resultData; // 存放请求结果14 void (^finishCallbackBlock)(NSString *); // 执行完成后回调的block15 16 }17 @property NSMutableData *resultData;18 @property(strong) void (^finishCallbackBlock)(NSString *);19 20 + (void)postExecuteWithUrlStr:(NSString *)urlStr Paramters:(NSString *)params FinishCallbackBlock:(void (^)(NSString *))block;21 22 @end

 

实现了<NSURLConnectionDataDelegate>协议,因为它要接收post请求的几个回调。

有一个NSMutableData对象,这个对象用于储存请求的结果。

一个finishCallbackBlock的block,这个block用于执行完成后的回调,这个block传入的参数就是返回的结果(这个结果已转成utf-8编码的字符串形式),我们可以在这个block中去处理请求完成后的逻辑

还有一个类方法,这个类方法暴露给外面,让外面进行调用

 

接下来,我们看下实现的方法.m文件:

 
View Code

在这个实现类中,我们在类方法中,先生成一个HttpPostExecutor对象,这个对象用于post请求的回调(因为实现了<NSURLConnectionDataDelegate>协议),然后去执行post连接。

接下来就等下面实现的回调方法被自动调用了,一旦调用

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

这个方法,就对resultData(用于存储post请求结果)进行初始化或者清空,因为要开始真正存储数据了嘛;

 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

这个方法进行回调的时候,把返回过来的这部分数据存储到resultData中,没什么好说的;

 

一旦回调- (void)connectionDidFinishLoading:(NSURLConnection *)connection这个方法,说明数据传输完毕了,要做的逻辑就是把数据转成utf-8编码的字符串,然后回调我们设置的回调finishCallbackBlock,把转好的结果字符串传进去,这样我们在回调block方法中实现的逻辑就能正常执行了。

 

一旦回调- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error这个方法,说明请求过程中出错了,比如断电、超时等,这时候,也回调我们设置的回调finishCallbackBlock,nil作为结果,这样我们在finishCallbackBlock中就能判断是正常的执行了post还是出了问题。

 

好了,接下来,我们就可以在外面去调用了,如下:

1 [HttpPostExecutor postExecuteWithUrlStr:@"http://www.baidu.com"2                                   Paramters:@""3                         FinishCallbackBlock:^(NSString *result){4                             // 执行post请求完成后的逻辑5                             NSLog(@"finish callback block, result: %@", result);6                         }];

这样,以后post请求只需要去调用上面这个方法,在回调block中去处理结果

之后,在我们的代码编写中,就可以只关心业务逻辑,不需要去在意请求协议和回调了

 

 

本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/p/3409721.html
,如需转载请自行联系原作者
你可能感兴趣的文章
NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
查看>>
一个思维习惯,让你成为架构师
查看>>
DNS子域授权
查看>>
MyBatis批量插入
查看>>
MySQL 数据类型
查看>>
进制转换算法
查看>>
RMAN-06214问题处理
查看>>
mysql半同步复制问题排查
查看>>
WIN2008系统的IIS7.0配置REWRITE伪静态环境
查看>>
36.Linux软件管理--YUM工具
查看>>
HACMP 认证学习系列,第 2 部分-1:计划与设计
查看>>
flex-10 flexfabric区别
查看>>
python 通过paramiko模块批量执行ssh命令
查看>>
Which SQL Operation May use Temp space?
查看>>
Linux下Redis-3.0.7版本的安装以及Redis主备的部署(二)
查看>>
使用OPATCH_DEBUG环境变量调试Opatch工具
查看>>
深度揭秘Windows 7
查看>>
sed 每次只替换一行
查看>>
使用克隆配置任务配置边缘传输服务器角色
查看>>
批量启用lync用户-3
查看>>