我正在尝试缓存我的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];
}
}];
}
答案 0 :(得分:7)
感谢您的代码,我设法让它与您的示例合作。
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
答案 1 :(得分:0)
夫特:
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!)
答案 2 :(得分:-3)
Follow this link使用NSURLConnection上的类别方法执行此操作的简单方法。它适用于异步请求,但可以轻松适应同步请求。
另外,我强烈建议您为NSOperationQueue使用私有属性或实例变量,以便所有请求都使用相同的操作队列。