如何在我的Siesta资源中访问不在列表JSON中的图像URL?
问题描述:
我正在使用Siesta和API,它为根实体返回一个非常轻量级的列表响应。例如,对于/entity
这是响应的样子:如何在我的Siesta资源中访问不在列表JSON中的图像URL?
{
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
列表的资源的一部分,是否可以从底层的/entity/1
端点获取更多详细信息?
答
在Siesta的世界观中,一个url⟺一个资源。因此,有一个“汇总列表”资源/entity
,另外还有一个单独的“实体细节”资源,用于每行,/entity/1
等。它们碰巧共享一些相同的数据并不重要; Siesta本身并没有做出任何努力来合并,同步,预先填充另一个资源。单独的URL和单独的资源。
经验法则是,“如果你从一个资源需要的数据,观察到的资源。”既然你想从/entities/n
从/entities
和详细信息使用这两种汇总信息,你观察这两个资源。
下面是一个方法的草图,你可以使用:
- 获得展示刚刚从
/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) } }
(本草图假定您有单独的EntitySummary
和EntityDetail
型号。您也可能有一个Entity
模型,其中只有详细信息字段是可选的,或者您可能只是使用原始JSON字典。该方法是一样的,不管)
这里是当一个细胞滚动到视图中发生了什么:
- 你
cellForRowAtIndexPath
电话showEntity(_:)
,传递一个EntitySummary
它从/entities
资源得到。 - 细胞开始观察
/entities/n
。 - 这立即触发
resourceChanged()
。详情资源还没有数据,因此您的单元格将立即填充摘要信息。 - 最终细节资源加载。如果您的手机仍在观察它,则
resourceChanged()
会再次被调用,并且这次它会看到详细信息。
注意,在#4,如果你的细胞得到滚出视和加载的详细资源之前重复使用,那么你的电池将不再遵守它 - 因此迟来的反应将不撞重用的单元格的内容。
感谢您的支持。我似乎无法让'configureTransformer'为'absoluteURL'资源工作。我有'self.configureTransformer(“/实体/ *”)'铸造到模型,但似乎没有工作。 –
它看起来像你的原始问题,如实体资源具有尾部斜杠,而'*'不匹配,所以你可能需要使用模式'“/ entity/* /”'而不是'“/ entity/*”'。 –