如何在我的Siesta资源中访问不在我的API列表JSON中的图像URL?

时间:2016-08-04 06:00:41

标签: siesta-swift

我正在使用带有API的Siesta,它为根实体返回一个非常轻量级的列表响应。例如,对于/entity,这就是响应的样子:

{
  count: 200,
  results: [
  {
    url: "https://example.com/api/entity/1/",
    name: "foo"
  },
  {
    url: "https://example.com/api/entity/2/",
    name: "bar"
  },
  {
    url: "https://example.com/api/entity/3/",
    name: "bat"
  }]
}

在结果中url找到的完整对象有一个avatar属性,我很想在此列表的表格视图中显示该属性,但我无法理解如何使用Siesta框架实现这一目标。作为加载/entity/1列表资源的一部分,是否可以从基础/entity端点获取更多详细信息?

1 个答案:

答案 0 :(得分:0)

在Siesta对世界的看法中,有一个url是一种资源。因此,有一个“摘要列表”资源/entity,以及每行/entity/1等单独的“实体详细信息”资源。它们碰巧共享一些相同的数据并不重要; Siesta本身并不做任何努力来合并,同步,预先填充另一个资源。单独的URL,单独的资源。

经验法则是,“如果您需要资源中的数据,请观察该资源。”因为您要使用/entities 中的摘要信息和<{em>来自{{的详细信息1}},你观察两种资源。

以下是您可能使用的方法草图:

  • 获取您的表格视图,仅显示/entities/n的信息,不显示头像。您可以使用示例项目中的RepositoryListViewController作为起点。
  • 让每个表格单元格接受一个摘要模型,并观察其相应的详细资源:

    /entities
  • 现在填充class EntityTableViewCell: UITableViewCell, ResourceObserver { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var avatar: RemoteImageView! private var summary: EntitySummary? private var detailResource: Resource? func showEntity(summary: EntitySummary) { self.summary = summary detailResource?.removeObservers(ownedBy: self) detailResource = MyApi.resource(absoluteURL: summary?.url) detailResource.addObserver(self).loadIfNeeded() } 中的单元格,根据您的需要从摘要和详细信息中混合和匹配:

    resourceChanged()
  • 您可能还希望在单元格移出视图时停止观察:

      func resourceChanged(resource: Resource, event: ResourceEvent) {
        let detail: EntityDetail? = detailResource?.typedContent()
        nameLabel.text = detail?.name ?? summary?.name
        avatar.imageURL = detail?.avatar
      }
    

(此草图假定您有单独的 override func prepareForReuse() { showEntity(nil) } } EntitySummary模型。您可能还有一个EntityDetail模型,其中仅详细信息字段是可选的,或者您可能只是使用原始JSON词典。无论如何,方法都是相同的。)

以下是单元格滚动到视图时发生的情况:

  1. 您的Entity来电cellForRowAtIndexPath,传递showEntity(_:)来自EntitySummary资源。
  2. 单元格开始观察/entities
  3. 这会立即触发/entities/n。详细信息资源尚无数据,因此您的单元格将立即仅填充摘要信息。
  4. 最终加载详细信息资源。如果您的单元格仍在观察它,则会再次调用resourceChanged(),这次它会看到详细信息。
  5. 请注意,在#4中,如果您的单元格已经滚动出视图并在加载该详细信息资源之前重新使用,那么您的单元格将不再观察它 - 因此迟到的响应将破坏重复使用的细胞的内容。