引入:
在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制。下面将介绍如何在IOS设备中进行缓存。 |
目的:
使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。 |
解读:
内存缓存我们可以使用sdk中的NSURLCache类。NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型。
1、NSURLRequestUseProtocolCachePolicy NSURLRequest默认的cache policy,使用Protocol协议定义。 2、NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载。 3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载。 4、NSURLRequestReturnCacheDataDontLoad 只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式; 5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。 6、NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。
NSURLCache还提供了很多方法,来方便我们实现应用程序的缓存机制。 |
实现:
1 // RootViewController.h 2 3 // cacheDemo 4 5 // (内存缓存demo-声明) 6 7 // Created by iMilo TEANA on 12-2-1. 8 9 // Copyright (c) 2012年 TEANA. All rights reserved. 10 11 // 12 13 14 15 #import <UIKit/UIKit.h> 16 17 18 19 @interface RootViewController : UIViewController 20 21 <NSURLConnectionDelegate> 22 23 24 25 - (IBAction)cachePress:(UIButton *)button; 26 27 28 29 @end 30 31 32 33 // 34 35 // RootViewController.m 36 37 // cacheDemo 38 39 // (内存缓存demo-定义) 40 41 // Created by iMilo TEANA on 12-2-1. 42 43 // Copyright (c) 2012年 TEANA. All rights reserved. 44 45 // 46 47 48 49 #import "RootViewController.h" 50 51 52 53 @interface RootViewController() 54 55 56 57 @property(nonatomic, retain) NSURLConnection *connection; 58 59 60 61 @end 62 63 64 65 @implementation RootViewController 66 67 68 69 @synthesize connection = _connection; 70 71 72 73 #pragma mark - 74 75 #pragma mark - super code 76 77 78 79 - (void)dealloc 80 81 { 82 83 [_connection release]; 84 85 [super dealloc]; 86 87 } 88 89 90 91 - (void)viewDidLoad 92 93 { 94 95 [super viewDidLoad]; 96 97 [[self view] setBackgroundColor:[UIColor redColor]]; 98 99 } 100 101 102 103 - (void)viewDidUnload 104 105 { 106 107 [super viewDidUnload]; 108 109 } 110 111 112 113 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 114 115 { 116 117 return (interfaceOrientation == UIInterfaceOrientationPortrait); 118 119 } 120 121 122 123 #pragma mark - 124 125 #pragma mark - user code 126 127 128 129 - (IBAction)cachePress:(UIButton *)button 130 131 { 132 133 //URL 134 135 NSString *URLStr = @"http://www.baidu.com"; 136 137 if ([URLStr length] == 0) 138 139 { 140 141 NSLog(@"Nil or empty URL is given"); 142 143 return; 144 145 } 146 147 //设置缓存 148 149 NSURLCache *urlCache = [NSURLCache sharedURLCache]; 150 151 //设置缓存大小未1M 152 153 [urlCache setMemoryCapacity:1*1024*1024]; 154 155 //创建URL 156 157 NSURL *URL = [NSURL URLWithString:URLStr]; 158 159 //创建请求 160 161 NSMutableURLRequest *request = 162 163 [NSMutableURLRequest requestWithURL:URL 164 165 cachePolicy:NSURLRequestUseProtocolCachePolicy //缓存策略(默认) 166 167 timeoutInterval:60.0f];// 168 169 //从请求中获取缓存输出 170 171 NSCachedURLResponse *response = [urlCache cachedResponseForRequest:request]; 172 173 //判断是否有缓存 174 175 if (response != nil) 176 177 { 178 179 NSLog(@"如果有缓存,从缓存中获取数据"); 180 181 [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; 182 183 } 184 185 //将链接置为空 186 187 _connection = nil; 188 189 //重新创建链接 190 191 NSURLConnection *connection = 192 193 [[NSURLConnection alloc] initWithRequest:request 194 195 delegate:self 196 197 startImmediately:YES]; 198 199 [self setConnection:connection]; 200 201 [connection release]; 202 203 connection = nil; 204 205 } 206 207 208 209 #pragma mark - 210 211 #pragma mark - delegate code 212 213 214 215 - (void)connection:(NSURLConnection *)connection 216 217 idReceiveResponse:(NSURLResponse *)response 218 219 { 220 221 NSLog(@"将要接收数据"); 222 223 } 224 225 226 227 - (NSURLRequest *)connection:(NSURLConnection *)connection 228 229 willSendRequest:(NSURLRequest *)request 230 231 redirectResponse:(NSURLResponse *)redirectResponse 232 233 { 234 235 NSLog(@"即将发送请求"); 236 237 return request; 238 239 } 240 241 242 243 - (void)connection:(NSURLConnection *)connection 244 245 didReceiveData:(NSData *)data 246 247 { 248 249 NSLog(@"接收数据,数据长度为:%lu",(unsigned long)[data length]); 250 251 } 252 253 254 255 - (NSCachedURLResponse *)connection:(NSURLConnection *)connection 256 257 willCacheResponse:(NSCachedURLResponse *)cachedResponse 258 259 { 260 261 NSLog(@"将缓存输出"); 262 263 return(cachedResponse); 264 265 } 266 267 268 269 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 270 271 { 272 273 NSLog(@"请求完成"); 274 275 } 276 277 278 279 - (void)connection:(NSURLConnection *)connection 280 281 didFailWithError:(NSError *)error 282 283 { 284 285 NSLog(@"请求失败"); 286 287 } 288 289 290 291 @end |