天天看点

Objective-c下具有下载功能的NSURLCache类CustomURLCache 在AppDelegate.m中将CustomURLCache设置为全局URLCache 将CustomURLCache设置为DOWNLOAD_MODE 将CustomURLCache恢复到NORMAL_MODE

同时为了兼容系统nsurlcache的功能,customurlcache有两种模式,normal_mode和download_mode,normalmode下的customcache和nsurlcache的功能是一样的;而downloadmode下的customurlcache则可以实现包含自定义下载目录,设置过期时间的子功能的下载功能。

接下来用例子教大家如何使用customurlcache这个类。假设我们在做一个阅读类的app,正文页面用uiwebviewcontroller来展示。现在需要实现一个离线下载的功能,即将当前网页的所有访问到的资源(html文件,图片,javascript,css等等)全部都保存到本地。用customurlcache就可以很容易地实现这个功能。

上文已经讲到了,在ios8中,设置全局urlcache必须在appdelegate.m中的<code>- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions</code>实现,所以第一步就是将我们customurlcache在该函数中设置为全局urlcache:

这段代码将我们的customurlcache设置为了全局的urlcache,其中的参数有如下意义:

diskcapacity:就是用户设置的这个cache的大小

diskpath:cache的下载路径,如果设置为nil的话,那么该类将会自动将当前应用的缓存目录作为下载路径

cachetime:cache的过期时间,如果设置为0的话,那么cache将永远不会过期

subdirectory:这是位于diskpath下的子目录,意为当前的cache会存在哪个子目录中。不过在初始化的时候只用将其设置为nil即可

值得说明的时候,在初始化之后其实没有任何变化,因为这个时候的默认模式是normal_mode,即跟nsurlcache是一样的。所以感觉不出什么不一样。不要着急,很快我们就需要使用到download_mode了。

好了,假设我们在第一个页面选中了一篇文章,然后点击计入了正文页面,正文页面的布局很简单,就是一个<code>uiwebview</code>,我们需要用其显示一个网页,并且将所有需要请求的资源都下载到本地自定义的目录中。这个时候就需要用到download_mode了。实现很简单,在正文界面的uiviewcontroller的<code>- (id)initwithnibname:(nsstring *)nibnameornil bundle:(nsbundle *)nibbundleornil</code>或者<code>init</code>函数中将customurlcache设置为download_mode:

现在我们就成功地将customurlcache设置为了下载模式,在执行<code>[_mcache changetodownloadmode:_subdir];</code>时需要指定下载子目录,就位于diskpath下的下载子目录。接下来所有的web请求资源都会下载到我们的自定义目录了。

好了,现在web页面也展现出来了,所有的web请求资源都下载到本地了,该退出了。回退到第一个页面,并且不再需要download_mode,我们要将其恢复为normal_mode,那么在当前uiviewcontroller下的dealloc函数或者其他用户自定义的退出函数中加入如下代码(在这里我使用的是自己的退出函数):

好了,如果你没有删除文章缓存,那么当我们再次就如正文页面的时候,你会发现页面很快就加在完成了。原因很简单,当你再次进入该uiviewcontroller的时候,程序又会执行<code>[_mcache changetodownloadmode:_subdir];</code>这时,customurlcache在接到url请求的时候会先到_subdir路径下去找是否有缓存的资源,如果找到了,并且还不过期,那么就会自动加在本地的资源,如果没有找到或者过期了,那么会重新通过网络请求。所以你知道为什么这么快就完成了,因为所有的资源都是在本地的!

继续阅读