前面讲到了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)
站点信息
- 文章2314
- 用户1336
- 访客11812443
每日一句
Let's seek joy in the simple, quiet moments.
让我们在简单宁静的时刻中寻找快乐。
让我们在简单宁静的时刻中寻找快乐。