以下内容为原创,欢迎转载,转载请注明
一般情况下的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请求的代码:
如果controller有很多异步操作,处理就会很麻烦,而且,很多时候我们只需要处理完成和异常(比如超时)的时候的反馈即可
所以,我需要编写一个post请求的封装类,只要传入请求的url、请求参数(字符串形式)、完成时的回调block
首先,新建类:HttpPostExecutor,.h如下:
实现了<NSURLConnectionDataDelegate>协议,因为它要接收post请求的几个回调。
有一个NSMutableData对象,这个对象用于储存请求的结果。
一个finishCallbackBlock的block,这个block用于执行完成后的回调,这个block传入的参数就是返回的结果(这个结果已转成utf-8编码的字符串形式),我们可以在这个block中去处理请求完成后的逻辑
还有一个类方法,这个类方法暴露给外面,让外面进行调用
接下来,我们看下实现的方法.m文件:

View Code
在这个实现类中,我们在类方法中,先生成一个HttpPostExecutor对象,这个对象用于post请求的回调(因为实现了<NSURLConnectionDataDelegate>协议),然后去执行post连接。
接下来就等下面实现的回调方法被自动调用了,一旦调用
这个方法,就对resultData(用于存储post请求结果)进行初始化或者清空,因为要开始真正存储数据了嘛;
这个方法进行回调的时候,把返回过来的这部分数据存储到resultData中,没什么好说的;
一旦回调- (void)connectionDidFinishLoading:(NSURLConnection *)connection这个方法,说明数据传输完毕了,要做的逻辑就是把数据转成utf-8编码的字符串,然后回调我们设置的回调finishCallbackBlock,把转好的结果字符串传进去,这样我们在回调block方法中实现的逻辑就能正常执行了。
一旦回调- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error这个方法,说明请求过程中出错了,比如断电、超时等,这时候,也回调我们设置的回调finishCallbackBlock,nil作为结果,这样我们在finishCallbackBlock中就能判断是正常的执行了post还是出了问题。
好了,接下来,我们就可以在外面去调用了,如下:
这样,以后post请求只需要去调用上面这个方法,在回调block中去处理结果
之后,在我们的代码编写中,就可以只关心业务逻辑,不需要去在意请求协议和回调了
<a href="http://pan.baidu.com/s/1uxVGh">测试demo下载</a>