1

ルート エンティティに対して非常に軽量なリスト レスポンスを返す 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

4

1 に答える 1

0

シエスタの世界観では、ひとつのURL⟺ひとつのリソース。このように、「概要リスト」リソースに/entity加えて、行ごとに個別の「エンティティ詳細」リソース/entity/1などがあります。同じデータの一部がたまたま共有されていても問題ありません。Siesta 自体は、1 つのリソースを別のリソースからマージ、同期、事前設定する努力をしません。個別の 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)
      }
    }
    

EntitySummary(このスケッチでは、個別の とモデルがあることを前提としていますEntityDetail。オプションの詳細のみのフィールドを持つ単一のEntityモデルがある場合もあれば、未加工の JSON 辞書を使用している場合もあります。アプローチは関係なく同じです。)

セルがスクロールして表示されると、次のようになります。

  1. あなたのcellForRowAtIndexPath呼び出し、リソースから取得したshowEntity(_:)を渡します。EntitySummary/entities
  2. セルは観察を開始し/entities/nます。
  3. この即時トリガーresourceChanged(). 詳細リソースにはまだデータがないため、セルにはすぐに概要情報のみが入力されます。
  4. 最終的に詳細リソースが読み込まれます。セルがまだそれを監視している場合は、resourceChanged()再度呼び出され、今回は詳細情報が表示されます。

#4 で、詳細リソースが読み込まれる前にセルがスクロールして表示されなくなり、再利用された場合、セルはそれを監視しなくなります。したがって、遅れて到着した応答によって、再利用されたセルのコンテンツが破壊されることはありません。

于 2016-08-04T07:10:31.640 に答える