前面讲到了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]; }]; }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2302
- 用户1336
- 访客10962994
每日一句
Progress starts with one brave step forward.
进步始于一次勇敢的迈步。
进步始于一次勇敢的迈步。
新会员