我有一个我正在编写的应用程序从一些网络资源中提取数据: 1)博客文章列表(UITableViewController) 2)视频列表(带有嵌入式UIScrollView的UIViewController) 3)图像列表(带有嵌入式UIScrollView的UIViewController)
现在,有一个带有菜单的主屏幕,当您按下其中一个按钮时,destinationViewController(如上所述)是根据需要加载数据的内容。我注意到这很慢,尤其是在使用蜂窝数据连接而不是wifi时。
我正在考虑创建一个预先请求所有数据的类,并在每次重新输入应用时启动它。有没有人有建议可以帮助我回答以下问题?
1)是否有任何类,框架或现有的代码我可以用来在一个地方启动这些请求? 2)我的目标视图控制器(如上所述)如何获取数据? 3)如果在数据可用之前碰巧调用数据,我的目标视图控制器如何得知数据已就绪? 4)我应该采用更好的策略吗?
我很感激帮助。
谢谢, 雅
答案 0 :(得分:0)
1)RestKit通常被认为是标准的网络互动框架之一http://restkit.org
2)RestKit提供-[getObjectsAtPath: parameters: success: failure:]
或post等方法,它们将成功提供响应。此外,它可以通过映射将响应直接转换为相应的对象。
3)通常我会发布一个对该请求唯一的通知,并且任何感兴趣的控制器都会收到通知,响应位于监听器内的notification.object
。此外,大多数网络请求都提供了一个回调处理程序,您可以直接更新UI。
4)我建议不要使用抢占式加载,因为你正在使用资源来实现你可能不会使用的东西。我的建议是将您的呼叫分解到尽可能小的级别,然后在发布通知时,将数据插入到UI中。
答案 1 :(得分:0)
在我的脑海中,我会创建你提到的请求类,并在AppDelegate中的applicationDidFinishLaunching中启动所有请求方法。我也可能为你将要获取的每种类型的对象和每个请求类方法制作自定义NSObject,将获取的数据转换为所述对象,然后在下载时将每个对象缓存到磁盘。然后在viewcontrollers中,根据需要获取缓存的对象。
在进行缓存时,请确保使用100%唯一的密钥缓存每个对象,因为在开始新的下载之前,您需要检查当前的本地缓存。我可能会将文件类型和文件名串起来,并将该字符串设置为缓存对象的键。
要在请求类方法中对当前缓存运行检查,请说“如果当前缓存包含密钥对象: uniqueKey ......什么都不做。如果是,则在完成后开始下载并缓存对象。“
还要在视图控制器中运行检查,因为您还需要处理视图控制器请求缓存对象但尚未下载的情况。所以有点像“如果当前缓存有密钥对象:密钥,太棒了!使用它。如果不是,开始下载...缓存它......然后给我一个回电话,这样我就可以使用它了向最终用户显示加载消息。“
我确定你还有其他一些情况需要处理,但那是我想要的理论方向。
编辑:
看看这个,它可能会帮到你很多。我认为它也使用Ego Cache(如果你不想编写自己的缓存方法):https://github.com/Infusion-apps/Download-Manager编辑2: 我也同意@RyanDignards第4点。如果可能,请避免获取您不需要的数据。但是,只有您真正了解您的UI / UX和应用程序功能,我的建议是假设您的最终用户很有可能仅使用您提供的内容来使用您的应用程序。所以他们很可能会想要阅读博客文章,观看视频等...如果您认为用户有更多机会查看所有内容,请致电您。我会去预加载路线,因为没有人喜欢等待用户。