NSURLRequest缓存无法正常工作
我正在尝试缓存我的nsurlrequest数据。 在此之前,我成功地从服务器下载数据,自从我尝试实现此缓存以来,它一直在使我的应用程序崩溃。 我希望有人可以看看我到目前为止的代码,并帮助我让它工作..我想我已经完成了大约95%。
- (IBAction)setRequestString:(NSString *)string { //Set database address NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http://127.0.0.1:29/"]; // imac development //PHP file name is being set from the parent view [databaseURL appendString:string]; //call ASIHTTP delegates (Used to connect to database) NSURL *url = [NSURL URLWithString:databaseURL]; //SynchronousRequest to grab the data, also setting up the cachePolicy NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0]; //if request dose not finish happen within 60 second timeout. //This nsdata will be used to put the cache into NSData *cacheData = [[NSData alloc] init]; //Create my own NSCachedURLResponse and add it to the cache NSURLResponse *responseToCache = [[NSURLResponse alloc] initWithURL:url MIMEType:@"text/xml" expectedContentLength:[cacheData length] textEncodingName:nil]; //Set up the cache NSCachedURLResponse *cacheResponse = [[NSCachedURLResponse alloc] initWithResponse:responseToCache data:cacheData]; [[NSURLCache sharedURLCache] storeCachedResponse:cacheResponse forRequest:request]; //check if its really there NSLog(@"cache = %@", [[NSURLCache sharedURLCache] cachedResponseForRequest:request]); //If no cache do this stuff, connect to the db and perform these actions. I think this is what i am supposed to be doing. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if ([data length] > 0 && error == nil){ [self receivedData:data]; }else if ([data length] == 0 && error == nil){ [self emptyReply]; }else if (error != nil && error.code == NSURLErrorTimedOut){ [self timedOut]; }else if (error != nil){ [self downloadError:error]; } }]; }
请按照此链接获取使用NSURLConnection上的类别方法执行此操作的简单方法。 它适用于异步请求,但可以轻松适应同步请求。
另外,我强烈建议您为NSOperationQueue使用私有属性或实例变量,以便所有请求都使用相同的操作队列。
感谢您的代码,我设法让它与您的示例一起工作。
cacheData是要缓存的数据,而不是缓存的位置。您必须自己获取并处理缓存。 为了清楚起见,我举了一个例子:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; NSCachedURLResponse *cachedURLResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; NSData *responseData; //check if has cache if(cachedURLResponse && cachedURLResponse != (id)[NSNull null]) { responseData = [cachedURLResponse data]; } else //if no cache get it from the server. { __autoreleasing NSError *error = nil; NSHTTPURLResponse *response = nil; responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; //..handle response and error //cache received data cachedURLResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:responseData userInfo:nil storagePolicy:NSURLCacheStorageAllowed]; //store in cache [[NSURLCache sharedURLCache] storeCachedResponse:cachedURLResponse forRequest:request]; } //..handle responseData
迅速:
let isReachable = NetworkManager.sharedManager().isInternetReachable()//Reachability- to check internet is available let urlRequestCache:NSURLRequest! if isReachable != 0 { //If ther is intenet then load and caching it urlRequestCache = NSURLRequest(URL: NSURL(string: url)!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10) let session = NSURLSession.sharedSession() session.dataTaskWithRequest(urlRequestCache, completionHandler: {(data, response, error) in let newCachedResponse = NSCachedURLResponse(response:(response)!, data:(data)!, userInfo:nil, storagePolicy: .Allowed) NSURLCache.sharedURLCache().storeCachedResponse(newCachedResponse, forRequest:urlRequestCache) }).resume() }else{ // check the cache is available urlRequestCache = NSURLRequest(URL: NSURL(string: url)!, cachePolicy: NSURLRequestCachePolicy.ReturnCacheDataElseLoad, timeoutInterval: 60) guard let _ = NSURLCache.sharedURLCache().cachedResponseForRequest(urlRequestCache) else{ //checking cache if false then print(" cache not found:)") return } print(" cache found:)") } browserView?.loadRequest(urlRequestCache!)