2016-08-04 18 views
1

我正在使用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端点获取更多详细信息?

回答

0

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

(本草图假定您有单独的EntitySummaryEntityDetail型号。您也可能有一个Entity模型,其中只有详细信息字段是可选的,或者您可能只是使用原始JSON字典。该方法是一样的,不管)

这里是当一个细胞滚动到视图中发生了什么:

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

注意,在#4,如果你的细胞得到滚出视和加载的详细资源之前重复使用,那么你的电池将不再遵守它 - 因此迟来的反应将撞重用的单元格的内容。

+0

感谢您的支持。我似乎无法让'configureTransformer'为'absoluteURL'资源工作。我有'self.configureTransformer(“/实体/ *”)'铸造到模型,但似乎没有工作。 –

+0

它看起来像你的原始问题,如实体资源具有尾部斜杠,而'*'不匹配,所以你可能需要使用模式'“/ entity/* /”'而不是'“/ entity/*”'。 –