2017-11-17 4 views
-1

データセットが大きすぎて、テーブルビューにデータを表示したい場合。可能な限り最良のアプローチは何ですか?大きなデータセットの場合はcellForRowAtIndexPathのWebサービスを呼び出すことをお勧めしますか?

第1のアプローチ - 私はcellForRowAtIndexPathでAPIを呼び出します。これは、スクロールするたびに何度も何度もサービスを受けることを意味します。私もデータをキャッシュすることができますが、それでも可能な限り最良のアプローチではないと思います。

第2のアプローチ - まず、すべてのデータをローカルに保存して表示します。これは、より多くの内部ストレージを占有することを意味します。

どちらのアプローチが優れているのですか、それとも良いアプローチがありますか?

+0

ローカルの配列にデータを20/30/40オブジェクト、twitter同様にダウンロードします。行のセルは何もダウンロードしてはいけません。 – JuicyFruit

+0

@ Piyush Vaishポイント1は良いアイデアではありません、ポイント2、データをローカルに保存する必要がある場合は、私は別のクラスを作ってAPIコールを呼び出し、モデルにデータを保存すると言うでしょう。 –

+0

このような要件はありません。大量のデータがある場合は、たとえばFacebookのフィードを使用すると、すべてのものをダウンロードして表示するのに大変な時間がかかります。明らかにメモリの問題があります。 –

答えて

0

あなたのAPIがページネーションをサポートしているかどうかによって、どのようなアプローチが取られますか。 APIがページネーションをサポートしていない場合は、他の解決策が残っていないので、すべてのものをワンショットで取得してtableViewに表示します。あなたのAPIは、ページネーションをサポートしている場合

、あなたは、次のページをフェッチするために、ユーザは、テーブル/ collectionViewの下にスクロールしたときにチェックして、WebサービスをトリガするViewDidLoadの最初のページをロードしてからscrollViewDidScrollデリゲートを実装するために電話をかけることができます応答。これは、サーバが空の配列で応答するまで続きます。

は、ここでは、のtableView/collectionView

extension ViewController : UIScrollViewDelegate { 
    func scrollViewDidScroll(_ scrollView: UIScrollView) { 
     let bottomEdge = scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.bounds.height 
     if scrollView.contentOffset.y >= bottomEdge { 
      //make a webservice call now 
     } 
    } 
} 
0

があまりにも多くの接続を作成するユーザーに達し最後は良いアイデアではないかどうかを判断するために利用することができ、簡単なscrollViewDidScrollオーバーライドです。

あなたはそれらをすべて入手し、少数の項目については1ページに表示する必要があります。

しかし、データが多すぎるため、2つのオプションがあります。それらを組み合わせることは、第3の選択肢として優れています。

  1. データを表示しないで、検索バーを実装し、検索テキストでデータを要求しないでください。検索テキストに従ってデータのサブセットをリクエストしました。

  2. リクエストデータのサブセット(例えば最初の20)とimlement load moreボタン(ボタンではなく、あなたもscrollviewのデリゲートを使用することができます)、またはpagination.

応答は、画像へのリンクを持っている場合は、あなたがダウンロードする必要がありますcellForRowAtIndexpathの画像。以前にダウンロードを開始した場合、ユーザーはあまり待つことになります。

関連する問題