2017-09-02 13 views
2

私は、WordPressのブログサイトから投稿を取得し、tableViewに表示するアプリケーションを構築しています。各テーブルビューセルには、ポストイメージ、タイトル、および抜粋テキストが表示されます。これはコースプロジェクトであり、Core Dataを使用する必要があります。だから私の質問は、ユーザーエクスペリエンスを向上させるために、ダウンロードした後すぐにセルに画像を表示してからStoreに保存するか、Storeに保存してフェッチして表示する必要がありますか?コアデータをダウンロードしてフェッチして表示しますか?ダウンロード、表示してから保存しますか?

いくつかの注意事項:アプリは、接続が確立している場合には、インターネット接続を確認します起動時に

  • 、ストアが清掃され、最新の投稿がダウンロードされます。

  • それは古い記事のダウンロードを実行します

  • がアップスクロール時に5件の記事をダウンロードします。
+0

私は最初に表示してから保存します。保存は安価な操作ではなく、バックグラウンドキューで実行する必要があります。そのため、完了するまで待つことはできません。 – Akki

+0

あなたの意見に感謝Akki –

答えて

1

これは意見に基づく質問です。私ができることは、過去にこのケースに対処するために私のアプリをどのようにデザインするかを教えてくれることです。

私のソリューション:

  1. 使用NSFetchedResultsControllerコアデータからデータを読み、あなたのUITableViewControllerまたはUICollectionViewController

  2. へのデータソースとしてNSFetchedResultsControllerのfetchedObjects配列を使用するためにはなるNSFetchedResultsControllerのデリゲートを実装しますコアデータ内のデータが変更されたときにトリガされます。この方法では、CollectionViewTableViewを効率的に更新し、UIのデータ変更をできるだけ早く表示できます。

  3. 用背景コンテキストは、あなたのメインスレッドが無料になりますそのようにデータを変更すると、アプリケーションが応答のまま。バックグラウンド・コンテキストを作成するために

  4. は、私は親、子コンテキストのアーキテクチャではなく、従来のマルチコンテキストアーキテクチャを好みます。親子コンテキストアーキテクチャは理解しやすく、コードをきれいに保ちます。

  5. イメージをコアデータに保存しないでください。代わりに、ドキュメントディレクトリにダウンロードしたイメージを保存し、ダウンロードしたファイルへの相対リンクをCoreDataに保存します。

  6. 私は絶対ファイルではなく、削除されたファイルへの相対パスを覚えています。アプリを破棄して再起動すると、アプリケーションフォルダ/サンドボックスパスが変更されるためです。コアデータのファイルへの絶対パスを保存することは、ロジックを台無しにするのには最適なレシピです。

  7. は、コアデータにデータを保存するの遅れを心配しないでください。遅れはあなたが気付かない秒数分の1秒であるかもしれません。データをアレイに保存してから、コアデータからデータを取り出して配列を更新することは、完全なノーです。個人的に

  8. 、代わりにNSFetchedResultsControllerのfetchedObjectsのデータを保存するために、配列を使用すると、完全にNOです。どうして ? Simple、Arrayはスレッドセーフではありません。なぜなら、バックグラウンドスレッドはWebサービス呼び出しを行い、複数のスレッドがArrayに同時にアクセスしている可能性のあるデータを解析するからです。 Arrayはスレッドセーフではないため、データの不一致の状態に簡単に陥り、クラッシュする可能性があります。

  9. 最後に、SDWebImageのようなライブラリを使用して画像を効率的に読み込みます。 SDWebImageはイメージを読み込むだけでなく、イメージを高速かつ迅速に読み込むことによって、イメージをさまざまなレベル(RAMおよびハードディスクにも)でキャッシュします。

  10. ページネーションを使用してデータを取得する場合は、scrollViewのデリゲートscrollViewDidScrollを使用して、ユーザーがテーブル/コレクションビューの最下部にスクロールしてWebサービスコールを行い、バックグラウンドスレッドのコアデータをフェッチします。 mainObjectContextを更新すると直ちにNSFetchedResultsコントローラのデリゲートがトリガされ、すぐにUIを更新できるはずです。

+1

あなたのご意見ありがとうございますSandeep。だから基本的には、最初に保存して、私がfetchResultsControllerを使ってtableViewデータソースを管理している限り、セーブ/フェッチの時間について心配する必要はありません。 scrollViewDidScrollを使用してデータをプリフェッチするという考えが好きでした。 –

+0

@ steven-taglohner:そうです。これは、オフラインでサポートされているほとんどのアプリがどのように機能するかを示します。いつもあなたのビューを起動するurのアプリケーションコントローラは単にコアデータからデータを読み込みますVCデータソースは常にNSFetchedResultsControllerです。その結果、ユーザーがいつでもあなたのアプリを起動するたびに表示するデータが得られます。つまり、更新されたデータを取得するためにバックグラウンドで呼び出しを行い、コアデータを解析して更新することができます。 Coredataが更新されるとすぐに、デリゲートとullによって通知され、UIを更新し、面倒なく新しいデータを表示できるようになります。このアプローチを使用していると思われるほとんどのアプリ –

関連する問題