1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,
2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行
3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;
4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。
005 | NSURL *url = [NSURL URLWithString:@ "http://api.hudong.com/iphonexml.do?type=focus-c" ]; |
011 | NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; |
017 | NSURLRequestUseProtocolCachePolicy(基础策略) |
019 | NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存) |
021 | NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载) |
023 | NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作) |
025 | NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载) |
027 | NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载) |
031 | NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; |
035 | NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding]; |
045 | NSURL *url = [NSURL URLWithString:@ "http://api.hudong.com/iphonexml.do" ]; |
049 | NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; |
051 | [request setHTTPMethod:@ "POST" ]; |
053 | NSString *str = @ "type=focus-c" ; |
055 | NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; |
057 | [request setHTTPBody:data]; |
063 | NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; |
067 | NSString *str1 = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding]; |
076 | NSURL *url = [NSURL URLWithString:@ "http://api.hudong.com/iphonexml.do?type=focus-c" ]; |
080 | NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; |
084 | NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; |
089 | NSURL *url = [NSURL URLWithString:@ "http://api.hudong.com/iphonexml.do" ]; |
093 | NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; |
095 | [request setHTTPMethod:@ "POST" ]; |
097 | NSString *str = @ "type=focus-c" ; |
099 | NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; |
101 | [request setHTTPBody:data]; |
105 | NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; |
111 | - ( void )connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response |
115 | NSHTTPURLResponse *res = (NSHTTPURLResponse *)response; |
117 | NSLog(@ "%@" ,[res allHeaderFields]); |
119 | self.receiveData = [NSMutableData data]; |
129 | -( void )connection:(NSURLConnection *)connection didReceiveData:(NSData *)data |
133 | [self.receiveData appendData:data]; |
139 | -( void )connectionDidFinishLoading:(NSURLConnection *)connection |
143 | NSString *receiveStr = [[NSString alloc]initWithData:self.receiveData encoding:NSUTF8StringEncoding]; |
145 | NSLog(@ "%@" ,receiveStr); |
151 | -( void )connection:(NSURLConnection *)connection |
153 | didFailWithError:(NSError *)error |
157 | NSLog(@ "%@" ,[error localizedDescription]); |
关于网络请求的重要性我想不用多说了吧。对于移动客户端来说,网络的重要性不言而喻。常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST。今天来看一下四种网络请求的实现方式。
一、同步GET
1
2
3
4
5
6
7
8
9
10
11
12
|
NSString *urlStr = [NSString stringWithFormat:@
"%@?query=%@®ion=%@&output=json&ak=6E823f587c95f0148c19993539b99295"
, kBusinessInfoURL, @
"银行"
, @
"济南"
];
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newUrlStr];
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
|
NSString *urlStr = [NSString stringWithFormat:@
"%@"
, kVideoURL];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *parmStr = @
"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"
;
NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:pramData];
[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 *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
[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
|
NSString *urlString = [NSString stringWithFormat:@
"%@"
,kVideoURL];
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 *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;
}
}
总结:通过这样的方式,形成了 内存 -> 文件系统 -> 网络图片 的三级图片访问系统。