2016-08-04 34 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/*」'。 –