我正在使用带有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
端点获取更多详细信息?
答案 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词典。无论如何,方法都是相同的。)
以下是单元格滚动到视图时发生的情况:
Entity
来电cellForRowAtIndexPath
,传递showEntity(_:)
来自EntitySummary
资源。/entities
。/entities/n
。详细信息资源尚无数据,因此您的单元格将立即仅填充摘要信息。resourceChanged()
,这次它会看到详细信息。请注意,在#4中,如果您的单元格已经滚动出视图并在加载该详细信息资源之前重新使用,那么您的单元格将不再观察它 - 因此迟到的响应将不破坏重复使用的细胞的内容。