ios - 我的模型对象是否应该负责下载它们自己的资源?

标签 ios model-view-controller

Myapp 使用远程 API 来更新其数据,并且它必须离线工作,因此必须在显示应用的主要部分之前下载所有数据。

API 返回一个表示应用程序内容的大 JSON 结构。 JSON 被转换为许多字典和数组,然后模型类被实例化并由这些字典和数组支持。

我的问题是这些字典和数组中的一些包含也必须下载的图像的 URL。是否应该由每个模型对象负责下载自己的图像?或者我应该有某种 Controller 类来处理这个吗?

另外,处理这个问题的好方法是什么?例如,我如何知道所有模型对象何时完成资源下载?

所有资源都必须预先上传,因为客户希望能够在没有互联网连接的情况下使用该应用程序。

最佳答案

答案取决于您应用的业务需求。

  1. 通常人们会预先下载 JSON 数据,但会推迟图像的加载,直到 UI 需要时才下载它们(一种称为“延迟加载”的模式)。一种特别优雅的处理方式是使用执行即时异步图像检索的 UIImageView 类别( SDWebImage 是一个很好的实现;如果您使用 AFNetworking,它也有一个)。对于这两种情况,您只需执行以下操作:

    [self.imageView setImageWithURL:url];
    

    这将异步检索图像,缓存图像以防您的 UI 再次需要它,等等。此外,如果您在具有单元格重用的 TableView 中使用它,它将取消对先前单元格的旧请求,这些单元格尚未下载尚未完成以确保对可见单元格图像的请求不会积压在一堆用户可能不再关心的旧请求之后,等等。

  2. 不过,有时您确实希望预先检索所有内容(例如,您正在下载一本杂志的内容,而您希望这些内容可供离线阅读)。

    在那种情况下,您可能有一个单独的数据 Controller 来下载和解析结果,而不是让模型本身进行检索。如果您需要在完成后通知 UI,您可以使用本地通知来执行此操作。

虽然后一种模式乍一看似乎很吸引人,但它有很多缺点。例如,如果用户使用蜂窝网络连接,您可能会花费大量带宽下载用户可能并不立即需要的图像,并在此过程中消耗用户的数据计划和电池电量。因此,您可能只想在以下情况下执行此操作:(a) 您确实需要预先准备好一切以供离线使用; (b) 您可以接受由此带来的资源消耗(数据计划和电池消耗)。

关于ios - 我的模型对象是否应该负责下载它们自己的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202350/

相关文章:

iphone - UITextView 不随 ARC 发布

ios - Fabric 发布 Xcode 6.3 协同设计 xcode-select

spring - 事务无法正常工作 - Spring/MyBatis

javascript - 主干事件映射不工作

ios - XCode 5 加载项目时崩溃

ios - 如何将 UIScrollView 设置为 3D 方形

ios - 在 iOS 中的 Safari 中打开本地 PDF

java - 应用MVC模式的时候让controller继承view可以吗?

database - 数据库插入调用应该返回什么?

model-view-controller - 可能是 Chrome 历史错误 - 执行 PRG,当再次导航到同一表单时 - 没有添加历史条目