IOS开发block进行HTTP网络POST请求回调简单封装

Home / Article MrLee 2014-11-26 3821

前面讲到了ios的类的创建,此处不再复述。我就直接开始贴代码了。里面都打了注释,大家可以认真的看看。这里我只作简
单的讲解HTTP的同步和异步区别和必要性。
同步
同步相当于是一个人要做一件事情,他在做这件事情的时候,发生了任何其它的事情他都不去理会或者说是应顾不暇。只能
把这件事情处理完成之后才能继续做其它的事情。
异步
异步相当于是一个人要要做N件事情,那么他每次也是只能做一件事情,那要完成多件事情怎么办呢?很简单,他要做的事
情就是把所有的事情分派给N个人去做,他只负责分派就行了。有点像公司的老总一样。他要完成一个APP,那么他会动
员公司做服务端、安卓、苹果、web的人去写代码,然后我们这群人就苦B了!无尽的加班加点,呵呵……
必要性
同步的必要性:直接举例说明,你现在要回家看仓老师,但是你没有带钥匙,你只能等你宿友回来给你开门,此时,你要
做的就是同步等待他回家……
异步的必要性:要去见某某女神,现在12点要买 3点的车票,你已经在出发的路上,但是你忘记带买的礼物了,此时你可以
让你的朋友把礼物带来,你此刻去火车站买车票。
不多说了,上代码:

//
//  HttpUtil.h
//  XQQ
//
//  Created by leehom on 14-11-26.
//  Copyright (c) 2014年 leehom. All rights reserved.
//
#import//函数别名,在C++相当于是定义一个函数.有类型及参数个数.要用的时候直接传你实现好的函数地址即可.
//在JAVA中相当于是接口interface,用于回调用的.但是没有Java接口这么强大,Java接口支持N个函数还能被继承
//这里面仅仅是一个函数体,在某时刻被调用而已
typedef void (^FinishBlock)(NSString *dataString);
//http代理
@interface HttpUtil : NSObject//定义需要的成员变量
@property (strong, nonatomic) NSMutableData *resultData;//保存HTTP结果对象
@property (strong, nonatomic) FinishBlock finishBlock;//回调方法
//该函数相当于是静态方法 不需要实例即可访问
+(NSString*)httpAsynchronousRequestUrl:(NSString*) spec postStr:(NSString*)sData;
//该函数相当于是静态方法 不需要实例即可访问
+(void)httpNsynchronousRequestUrl:(NSString*) spec postStr:(NSString*)sData finshedBlock:(FinishBlock)block;
@end


.m文件

//
//  HttpUtil.m
//  XQQ
//
//  Created by leehom on 14-11-26.
//  Copyright (c) 2014年 leehom. All rights reserved.
//
#import "HttpUtil.h"
@implementation HttpUtil
//该方法同步请求服务器,需要在主线程中创建其它线程完成请求,否则会阻塞主线程导致UI卡住
+(NSString*) httpAsynchronousRequestUrl:(NSString*) spec postStr:(NSString *)sData
{
    NSURL *url = [NSURL URLWithString:spec];
    NSMutableURLRequest *requst = [NSMutableURLRequest requestWithURL:url];
    [requst setHTTPMethod:@"POST"];
    NSData *postData = [sData dataUsingEncoding:NSUTF8StringEncoding];
    [requst setHTTPBody:postData];
    [requst setTimeoutInterval:15.0];
    NSHTTPURLResponse *urlResponse = nil;
    NSError *error = nil;
    //如果使用局部变量指针需要传指针的地址
    NSData *data = [NSURLConnection sendSynchronousRequest:requst returningResponse:&urlResponse error:&error];
    NSString *returnStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"code:%ld",[urlResponse statusCode]);
    if ([urlResponse statusCode] == 200) {
        return returnStr;
    }
    return nil;
}
//该方法为异步请求服务器,不用在主线程创建其它线程
+(void) httpNsynchronousRequestUrl:(NSString*) spec postStr:(NSString*)sData finshedBlock:(FinishBlock)block
{
    HttpUtil *http = [[HttpUtil alloc]init];
    http.finishBlock = block;
    //初始HTTP
    NSURL *url = [NSURL URLWithString:spec];
    NSMutableURLRequest *requst = [NSMutableURLRequest requestWithURL:url];
    [requst setHTTPMethod:@"POST"];
    NSData *postData = [sData dataUsingEncoding:NSUTF8StringEncoding];
    [requst setHTTPBody:postData];
    [requst setTimeoutInterval:15.0];
    //连接
    NSURLConnection *con = [[NSURLConnection alloc]initWithRequest:requst delegate:http];
    NSLog(con ? @"连接创建成功" : @"连接创建失败");
}
//收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"didReceiveData");
    [self.resultData appendData:data];
}
//接收到服务器回应的时回调
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"didReceiveResponse");
    if (self.resultData == nil) {
        self.resultData = [[NSMutableData alloc]init];
    }else{
        [self.resultData setLength:0];
    }
}
//数据传完之后调用此方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"connectionDidFinishLoading");
    NSString *retStr = [[NSString alloc]initWithData:self.resultData encoding:NSUTF8StringEncoding];
    if(self.finishBlock != nil)
        self.finishBlock(retStr);
}
//网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError");
    if(self.finishBlock != nil)
        self.finishBlock(nil);
}
@end


使用起来很简单:

    NSString *api = @"http://www.it72.com/test.php";
    NSString *sData = @"username=admin&password=admin";
    BOOL isSyn = YES;
    if (isSyn) {
        //同步
        NSString *dataString = [HttpUtil httpAsynchronousRequestUrl:api postStr:sData];
         NSLog(@"synResult:%@",dataString);
        [self.dialog removeFromSuperview];
    } else {
        //异步
        [HttpUtil httpNsynchronousRequestUrl:api postStr:sData finshedBlock:^(NSString *dataString) {
            NSLog(@"nsynResult:%@",dataString);
            [self.dialog removeFromSuperview];
        }];
    }

本文链接:https://www.it72.com/328.htm

推荐阅读
最新回复 (0)
返回