Myapp使用远程API来更新其数据,并且必须脱机工作,因此在显示应用程序的主要部分之前必须下载所有数据。
API返回一个代表应用内容的大型JSON结构。 JSON被转换为许多字典和数组,然后模型类被实例化并由这些字典和数组支持。
我的问题是这些词典和数组中的一些包含也必须下载的图像的URL。是否每个模型对象都有责任下载自己的图像?或者我应该有某种处理此类的控制器类?
另外,处理这个问题的好方法是什么?例如,我如何知道所有模型对象何时完成下载资源?
所有资源必须预先上传,因为客户希望能够在没有互联网连接的情况下使用该应用。
答案 0 :(得分:2)
答案取决于您应用的业务需求。
通常会先预先下载JSON数据,但是推迟加载图像,而不是在UI需要时下载它们(称为“延迟加载”的模式)。一种特别优雅的处理方法是使用UIImageView
类别执行即时异步图像检索(SDWebImage是一个非常好的实现;如果你使用AFNetworking,它也有一个)。对于这两者,您只需执行以下操作:
[self.imageView setImageWithURL:url];
这将异步检索图像,缓存图像以防UI再次需要它等。另外,如果你在具有单元重用的tableview中使用它,它将取消对下载没有的旧单元的旧请求尚未完成以确保对可见单元格图像的请求不会在用户可能不再关心的一堆旧请求后面积压等等。
但有时候,您确实想要预先检索所有内容(例如,您正在下载要供离线阅读的杂志的内容)。
在这种情况下,您可能有一个单独的数据控制器来下载和解析结果,而不是让模型本身进行检索。如果您需要在完成此操作后通知用户界面,则可以使用本地通知。
虽然后一种模式乍一看似乎很吸引人,但它有许多缺点。例如,如果用户处于蜂窝连接状态,您可能会花费大量带宽下载用户可能不会立即需要的图像,从而在此过程中消耗用户的数据计划和电池。所以你可能只想这样做,如果(a)你真的需要一切预先离线使用; (b)你可以利用资源(数据计划和电池消耗)来消耗这些资源。
答案 1 :(得分:1)
您可能需要一个下载管理器类(与您的型号分开)来处理下载图像。您的经理类将管理操作的操作队列,每个操作队列都会下载给定模型对象的资产。使用AFNetworking将使所有这一切变得非常简单。然后,您可以在后台运行这些操作,让您的用户在下载时继续使用UI。
您的下载管理器将创建AFHTTPClient
,在模型中循环创建一个AFImageRequestOperation
的数组,每个模型一个(如果每个模型有多个图像,则每次下载一个)。将您的操作数组传递到HTTP客户端上的enqueueBatchOfHTTPRequestOperations: progressBlock: completionBlock:
。所有下载操作完成后,将调用完成块。
一旦您拥有JSON中的所有模型,就应该运行此下载过程,以确保您拥有获取所有资产所需的所有数据。
编辑:值得注意的是,如果你只支持iOS 7,那么AFNetworking的AFHTTPSessionManager
会更合适。我提供的建议适用于iOS 7,iOS 6也支持。