标签:ssi 更新 nsf off one div 而且 clipboard blank
在手机应用程序开发中,为了降低与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存。这篇文章将设计一个本地缓存的机制。
功能需求
这个缓存机制满足以下这些功能。
1、能够将数据缓存到本地磁盘。
2、能够推断一个资源是否已经被缓存。假设已经被缓存。在请求同样的资源。先到本地磁盘搜索。
3、能够推断文件缓存什么时候过期。这里为了简单起见这里,我们在请求url资源的时候。给每次请求的文件设定一个过期的时间。
4、能够实现:假设文件已经被缓存,并且没有过期。这将本地的数据返回,否则又一次请求url。
5、能够实现:假设文件下载不成功或者下载没有完毕,下次打开程序的时候,移除这些没有成功或者没有下载完毕的文件。
6、能够实现:同一时候请求或者下载多个资源。
设计实现:
1、设计一个CacheItem类,用来请求一个web连接,它的一个实例表示一个缓存项。
这个CacheItem类,须要一个url创建一个NSURLConnection,去请求web资源。
使用CacheItem类主要用来请求web资源。
2、在NSURLConnection開始请求之前,调用CachedDownloadManager类,来搜索和管理本地的缓存文件。将缓存文件的情况保存到一个字典类中。
这个字典设计例如以下:
上面这个字典里面嵌套了字典。里面那层字典表示一个缓存项的缓存信息:下载结束时间、下载開始时间、缓存有效时间、缓存过期时间、缓存到本地的路径。
以下看下CachedDownloadManager类。
用它来实现和封装我们的缓存策略。
从上面代码能够看出,这个管理缓存的类中。有一个缓存字典:cacheDictionary,用来表示全部资源的缓存情况;cacheDictionaryPath用来表示缓存的路径。saveCacheDictionary用来将缓存字典归档到本地文件里。
download:urlMustExpireInSeconds:updateExpiryDateIfInCache是一个公共接口,通过传递url、缓存过期时间、是否更新缓存过期时间三个參数来方便的使用,实现我们的缓存策略。
3、假设这个文件已经被下载,并且没有过期。则从本地获取文件的数据。假设文件已经过期。则又一次下载。
我们通过download:urlMustExpireInSeconds:updateExpiryDateIfInCache方法来实现,主要看这种方法的代码:
4、以下我们设计缓存项下载成功和失败的两个托付方法:
当我们下载成功的时候,改动缓存字典中的下载时间,表示已经下载完毕。并且须要将请求的资源数据缓存到本地:
这样就基本上完毕了我们须要的功能。以下看看我们怎样使用我们设计的缓存功能。
样例场景:
我们用一个UIWebView来显示stackoverflow这个站点,我们在这个站点的内容缓存到本地20秒,假设在20秒内用户去请求该站点,则从本地文件里获取内容,否则过了20秒。则又一次获取数据,并缓存到本地。
在界面上拖放一个button和一个webview控件,例如以下图。
这样我们能够非常方便使用前面定义好的类。
我们在viewDidLoad 中实例化一个CachedDownloadManager,并设置它的托付为self。
当下载完毕的时候。运行CachedDownloadManager的下载成功的托付方法。
- (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"本地缓存測试"]; CachedDownloadManager *newManager = [[CachedDownloadManager alloc] init]; self.downloadManager = newManager; [newManager release]; [self.downloadManager setDelegate:self]; }
在button的点击事件中增加以下代码,请求stackoverflow :
static NSString *url = @"http://stackoverflow.com"; [self.downloadManager download:url urlMustExpireInSeconds:20.0f updateExpiryDateIfInCache:YES];
上面的代码表示将这个stackoverflow的缓存事件设置为20s。而且假设在20s内有同样的请求,则从本地获取stackoverflow的内容数据。updateExpiryDateIfInCache设置为yes表示:在此请求的时候。缓存时间又更新为20s。类似我们的session。假设设置成no。则第一次请求20s之后。该缓存就过期。
请求完毕之后会运行CachedDownloadManager的托付方法。我们将数据展示在uiwebview中,代码例如以下:
- (void) cachedDownloadManagerSucceeded:(CachedDownloadManager *)paramSender remoteURL:(NSURL *)paramRemoteURL localURL:(NSURL *)paramLocalURL aboutToBeReleasedData:(NSData *)paramAboutToBeReleasedData isCachedData:(BOOL)paramIsCachedData{ [webview loadData:paramAboutToBeReleasedData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@"http://stackoverflow.com"]]; }
这样我们就实现了20s的缓存。
效果:
第一次点击測试button:
20s内点击button,程序就从本地获取数据。比較高速的就显示出该网页了。
总结:
本文通过代码和实例设计了一个iPhone应用程序本地缓存的方案。
当然这个方法不是最好的,假设你有更好的思路。欢迎告诉我。
标签:ssi 更新 nsf off one div 而且 clipboard blank
原文地址:http://www.cnblogs.com/zhchoutai/p/7248273.html