2014-01-21 32 views
0

我有一个应用程序,我正在编写从几个网络来源提取数据: 1)博客文章列表(UITableViewController) 2)视频列表(UIViewController with嵌入式的UIScrollView) 3)图像(UIViewController中带有嵌入式的UIScrollView)ios应用程序通过预先请求数据提高网络性能

眼下的列表中,有一个主屏幕,菜单,当你按下一个按钮,一个destinationViewController(如上所述)是什么样的负载数据需求。我注意到这很慢,尤其是在蜂窝数据连接而不是WiFi时。

我正在考虑创建一个请求所有数据的类,并在每次重新进入应用程序时启动它。有没有人有建议,可以帮助我回答以下问题?

1)是否有任何类,框架或现有的我可以用来在一个地方启动这些请求的代码? 2)我的目标视图控制器(如上所述)如何获取数据? 3)如果我们的目标视图控制器恰好在数据可用之前被调用,它将如何获知数据已准备就绪? 4)我应该采用更好的策略吗?

我很感激帮助。

谢谢, 雅

+0

需要更多信息。什么格式的数据,JSON,文本等?当应用程序启动时,是否要将数据保存到设备并从保存的版本加载它?我不认为所有事情都可以事先要求,在某些时候,用户将不得不等待。 –

回答

0

关闭我的头顶,我会让你提到的请求类,并开始在applicationDidFinishLaunching的所有请求方法在AppDelegate中。我也可能会进行自定义NSObjects每种类型你会获取物体和每个您的要求类的方法,所获取的数据转换成上述目标,那么每个对象缓存到磁盘,因为他们下载。然后在您的视图控制器中,根据需要获取缓存的对象。

当你cacheing,请确保您缓存,将100%是唯一的,因为你会想你开始一个新的下载之前运行对当前本地缓存中检查的一个关键的每个对象。我可能会将文件类型和文件名串起来,并将该字符串设置为缓存对象的关键字。

要在您的请求类方法中运行当前缓存的检查,说“如果当前缓存包含对象的关键字: uniqueKey ...什么也不做,否则开始下载并在完成时缓存对象。“

也在你的视图控制器中运行检查,因为你也想要处理视图控制器请求缓存对象但尚未下载的情况。 “如果当前缓存有key:key的对象,太棒了!用它。如果其他人,开始下载...缓存它...然后给我打电话回来,所以我可以使用它,而我显示加载消息给最终用户。”

我敢肯定还有其他的方案,你将不得不去处理,但是这就是理论指导我的头

编辑:

退房这一点,它可能会帮助你很多,我认为它也采用自我缓存(如果你。不想写你自己的缓存方法):https://github.com/Infusion-apps/Download-Manager

编辑2: 我也同意@RyanDignards poi nt#4。如果可能,避免提取不需要的数据。然而,只有您真的了解您的用户界面/用户体验和应用程序功能,而且我的建议是假设您的最终用户很有可能会仅使用您的应用程序来消费您提供的内容。因此,他们最有可能会被想阅读博客文章,观看视频等等......电话是你的,如果你想有更多的机会的用户会观看所有的内容比不了,我会去预加载路线,因为没有什么不喜欢用户等待。

+0

至于获取的所有数据前期VS上demmand,它是目前在demmand和我注意到它的显著缓慢。也许你上面提到的下载管理器是使用缓存的好方法。但我担心的是一些网址(如获取图片列表)始终是相同的网址。如果缓存是一个,不用它只是去缓存,永远不会得到更新的图像列表? 此外,应用程序的主要目的是消耗contnent,但如果他们正在进入应用读取博客文章或观看视频或两者我不能保证。我只是不想让他们等待。 –

+0

你不想缓存从最初的服务调用的结果来获得图像的实际列表下载,你只需要你把它拿来(大男孩后,从该列表缓存单个文件:视频文件,图像文件等等)。如果服务调用设计正确,那么获取当前对象列表的初始调用实际上不应该返回对象本身,而只是一个指针或url,然后去下载对象。因此,“获取图像列表”的初始请求应该非常快。一旦你有这个列表,然后你循环通过&下载和缓存每个文件 –

+0

好吧,我想def prechech'列表'的内容,但因为即使这需要一段时间下载。我想知道Download-Manager是否有办法为不同的项目设置不同的缓存过期。 –

0

1)RestKit被普遍认为是标准的网络交互的一个构架http://restkit.org

2)RestKit提供了一些方法,如-[getObjectsAtPath: parameters: success: failure:]或交,这将提供在成功的响应。此外,它可以通过映射将响应直接转换为相应的对象。

3)一般来说,我会发布一个通知,这是独一无二的这一要求,任何有兴趣的控制器将获得通知,与位于notification.object听众中的响应。此外,大多数网络请求都提供了一个回调处理程序,您可以直接更新UI。

4)我建议不要抢先加载,因为你正在使用的资源的东西,你可能没有实际使用。我的建议是将呼叫细分为最小可能的级别,然后在发布通知时将该数据插入到用户界面中。