网络请求

1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,

2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行

3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;

4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。

 

001 1、     同步GET请求
002  
003     //第一步,创建URL
004  
005     NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
006  
007      
008  
009     //第二步,通过URL创建网络请求
010  
011     NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
012  
013     //NSURLRequest初始化方法第一个参数:请求访问路径,第二个参数:缓存协议,第三个参数:网络请求超时时间(秒)
014  
015       其中缓存协议是个枚举类型包含:
016  
017       NSURLRequestUseProtocolCachePolicy(基础策略)
018  
019       NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)
020  
021       NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)
022  
023       NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)
024  
025       NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)
026  
027       NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)
028  
029     //第三步,连接服务器
030  
031     NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
032  
033      
034  
035     NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];
036  
037      
038  
039     NSLog(@"%@",str);
040  
041 2、同步POST请求
042  
043     //第一步,创建URL
044  
045     NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];
046  
047     //第二步,创建请求
048  
049     NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
050  
051     [request setHTTPMethod:@"POST"];//设置请求方式为POST,默认为GET
052  
053     NSString *str = @"type=focus-c";//设置参数
054  
055     NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
056  
057     [request setHTTPBody:data];
058  
059     //第三步,连接服务器
060  
061      
062  
063     NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
064  
065      
066  
067     NSString *str1 = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];
068  
069      
070  
071     NSLog(@"%@",str1);
072 3、异步GET请求
073  
074     //第一步,创建url
075  
076     NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
077  
078     //第二步,创建请求
079  
080     NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
081  
082     //第三步,连接服务器
083  
084     NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
085 4、异步POST请求
086  
087     //第一步,创建url
088  
089     NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];
090  
091     //第二步,创建请求
092  
093     NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
094  
095     [request setHTTPMethod:@"POST"];
096  
097     NSString *str = @"type=focus-c";
098  
099     NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
100  
101     [request setHTTPBody:data];
102  
103     //第三步,连接服务器
104  
105     NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
106  
107 5、异步请求的代理方法
108  
109 //接收到服务器回应的时候调用此方法
110  
111 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
112  
113 {
114  
115     NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
116  
117     NSLog(@"%@",[res allHeaderFields]);
118  
119     self.receiveData = [NSMutableData data];
120  
121    
122  
123                                
124  
125 }
126  
127 //接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
128  
129 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
130  
131 {
132  
133     [self.receiveData appendData:data];
134  
135 }
136  
137 //数据传完之后调用此方法
138  
139 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
140  
141 {
142  
143     NSString *receiveStr = [[NSString alloc]initWithData:self.receiveData encoding:NSUTF8StringEncoding];
144  
145     NSLog(@"%@",receiveStr);
146  
147 }
148  
149 //网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法
150  
151 -(void)connection:(NSURLConnection *)connection
152  
153  didFailWithError:(NSError *)error
154  
155 {
156  

157     NSLog(@"%@",[error localizedDescription]);

关于网络请求的重要性我想不用多说了吧。对于移动客户端来说,网络的重要性不言而喻。常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST。今天来看一下四种网络请求的实现方式。

一、同步GET

1
2
3
4
5
6
7
8
9
10
11
12
// 1.将网址初始化成一个OC字符串对象
NSString *urlStr = [NSString stringWithFormat:@ "%@?query=%@®ion=%@&output=json&ak=6E823f587c95f0148c19993539b99295" , kBusinessInfoURL, @ "银行" , @ "济南" ];
// 如果网址中存在中文,进行URLEncode
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 2.构建网络URL对象, NSURL
NSURL *url = [NSURL URLWithString:newUrlStr];
// 3.创建网络请求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
// 创建同步链接
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

当创建好同步链接以后, 就可以采用相应的方法进行解析。下面创建异步连接也是一样的。

二、同步POST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 1.根据网址初始化OC字符串对象
     NSString *urlStr = [NSString stringWithFormat:@ "%@" , kVideoURL];
     // 2.创建NSURL对象
     NSURL *url = [NSURL URLWithString:urlStr];
     // 3.创建请求
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
     // 4.创建参数字符串对象
     NSString *parmStr = @ "method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10" ;
     // 5.将字符串转为NSData对象
     NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
     // 6.设置请求体
     [request setHTTPBody:pramData];
     // 7.设置请求方式
     [request setHTTPMethod:@ "POST" ];
     
     // 创建同步链接
     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

三、异步GET

1
2
3
4
5
6
7
8
9
10
11
     NSString *urlStr = [NSString stringWithFormat:@ "http://image.zcool.com.cn/56/13/1308200901454.jpg" ];
     NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     NSURL *url = [NSURL URLWithString:newStr];
     NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
     //异步链接(形式1,较少用)
     [NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         self.imageView.image = [UIImage imageWithData:data];
         // 解析
         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
         NSLog(@ "%@" , dic);
     }];

四、异步POST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// POST请求
     NSString *urlString = [NSString stringWithFormat:@ "%@" ,kVideoURL];
     //创建url对象
     NSURL *url = [NSURL URLWithString:urlString];
     //创建请求
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
     //创建参数字符串对象
     NSString *parmStr = [NSString stringWithFormat:@ "method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10" ];
     //将字符串转换为NSData对象
     NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
     [request setHTTPBody:data];
     [request setHTTPMethod:@ "POST" ];
     //创建异步连接(形式二)
     [NSURLConnection connectionWithRequest:request delegate:self];

一般的,当创建异步连接时, 很少用到第一种方式,经常使用的是代理方法。关于NSURLConnectionDataDelegate,我们经常使用的协议方法为一下几个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 服务器接收到请求时
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
// 当收到服务器返回的数据时触发, 返回的可能是资源片段
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
// 当服务器返回所有数据时触发, 数据返回完毕
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
}
// 请求数据失败时触发
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
     NSLog(@ "%s" , __FUNCTION__);
}

最后,分析一下这几种呢网络请求的区别。

GET请求和POST请求的区别:

1. GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过 ? 来间隔。POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器。

2. GET请求参数会出现在接口中,不安全。而POST请求相对安全。

3.虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,POST多用于向后台提交数据。

同步和异步的区别:

同步链接:主线程去请求数据,当数据请求完毕之前,其他线程一律不响应,会造成程序就假死现象。

异步链接:会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅。


利用NSCache提升效率


在ios中,苹果提供了,NSCache类和NSDictionary很相似,提供key,value的存储,不一样的是NSCache在内存吃紧的时候会做自动释放。

遇到一个问题是,在使用大量图片的app中,需要从存储里面读取数据,每次都从文件系统里面读取文件会造成卡顿现象。

解决办法就是把NSData对象缓存起来,先从NSCache里面读取数据,然后再从文件系统获取数据,提高效率。

方法如下:

步骤1:需要一个单例的NSCache,由于我们的FileUtil本来就是单例的,所以只是需要在初始化FileUtil的时候实例出一个NSCache就行了。

_cache = [[NSCache alloc] init];

步骤2:写文件的时候,把NSData存入NSCache里面

-(void)write:(NSData*)data forKey:(NSString*)key

{

NSString *filepath  = [self filePathForKey:key];

[_cache setObject:data forKey:key];

dispatch_async(fileQueue, ^{

[[NSFileManager defaultManager] createFileAtPath:filepath contents:data attributes:nil];

});

}

步骤3:读文件时候,先从NSCache里面读取,如果没有再从文件系统中读取。从文件系统中读取到的数据,再放回到NSCache中。

-(NSData*)readForKey:(NSString*)key

{

if(key==nil){

return nil;

}

NSData *cacheData = [_cache objectForKey:key];

if(cacheData){

NSLog(@"get data from cache");

return cacheData;

}else{

NSLog(@"miss data from cache");

NSString *filepath =[self filePathForKey:key];

NSData *fileData =  [[NSFileManager defaultManager] contentsAtPath:filepath];

if(fileData){

[_cache setObject:fileData forKey:key];

}

return fileData;

}

}

总结:通过这样的方式,形成了 内存 -> 文件系统  -> 网络图片 的三级图片访问系统。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值