1

我正在使用 Siesta 和一个 API,它为根实体返回一个非常轻量级的列表响应。例如,/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

4

1 回答 1

0

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

经验法则是,“如果您需要来自资源的数据,请观察该资源。” 由于您想同时使用来自 的摘要信息和来自 的/entities 详细信息/entities/n,因此您可以观察这两种资源。

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

  • 让您的表格视图仅显示来自 的信息/entities,没有头像。您可以使用示例项目中的RepositoryListViewController作为起点。
  • 让每个表格单元格接受一个汇总模型,并观察其对应的明细资源:

    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)
      }
    }
    

(此草图假定您有单独的EntitySummaryEntityDetail模型。您可能还有一个Entity模型,其中仅包含可选的详细字段,或者您可能只使用原始 JSON 字典。无论如何,方法都是相同的。)

当单元格滚动到视图中时会发生以下情况:

  1. 您的cellForRowAtIndexPath调用showEntity(_:),传递EntitySummary它从/entities资源中获得的。
  2. 细胞开始观察/entities/n
  3. 这立即触发resourceChanged()。详细资源还没有数据,因此您的单元格会立即仅填充摘要信息。
  4. 最终加载详细资源。如果您的手机仍在观察它,则会resourceChanged()再次调用它,这一次它会看到详细信息。

请注意,在 #4 中,如果您的单元格在该详细资源加载之前被滚动出视图并被重用,那么您的单元格将不再观察它 - 因此迟到的响应不会破坏重用单元格的内容。

于 2016-08-04T07:10:31.640 回答