2

これは、モノタッチ/xamarin 環境のより一般的なソフトウェア アーキテクチャに関する質問です。

これが私の問題です:

私が現在構築しているアプリは、アプリの起動時に約 30k の json オブジェクト (6mb) をダウンロードします。その後、データはローカルに保存されるため、すべての画面でローカル db (sqlite) 呼び出しが行われます。

主な問題は、ダウンロードの実行にかかる時間です。現時点では、シミュレーターで合計約 36 秒かかり、次のタスクに分割されます。

  1. ダウンロード〜10秒
  2. データ変換 (json からネイティブ obj へ) ~ 16 秒
  3. データベース挿入 ~ 10 秒

特にアプリストアにある同様のアプリと比較すると、これは長すぎます。ここで何かをしていないように感じますか、それとも別の方法を認識していませんか? 私が実装した改善点は次のとおりです。

  1. gzip 応答 - 現在 6 MB ですが、gzip を使用すると最大 1 MB になります
  2. インストールされた ServiceStack.Text json シリアライザー、json.net よりも約 2.5 倍高速 (ただし、それでも 16 秒は長すぎます)
  3. フラット化された json 応答により、応答配列で db.InsertAll() を実行して (余分なループなどを行わずに)、より堅牢な db インポート (トランザクション) を実現できます。
  4. 1日1回の通話制限

今、私がやりたいことは、アプリの起動時にローカル データを表示し、バックグラウンドでダウンロード/アップデーターを初期化することです。唯一の問題は、ダウンロードに時間がかかることと、新しくインストールされたアプリに表示するローカル データがないことです...

私の質問は次のとおりです。

  1. mvc 4 api -> json convert -> sqlite import は、このタイプのアプリに適したアプローチですか? そうでない場合 - 代替手段は何ですか?

サーバーが代わりに実際のsqliteファイルをzip形式の応答で返すか、zip形式のdbコマンドを返すことを考えていました...または、sqliteはこのタイプのアプリには適していませんか? ローカル ストレージのより良い代替手段はありますか? .netシリアライザー/xmlなど?

ご提案いただきありがとうございます。

4

1 に答える 1

2

私の提案は、作業を非同期で行うことです。C# を使用すると非常に簡単に実行できるので、幸運です。例えば

  1. バックグラウンド ダウンロードを開始します。
  2. ダウンロード時にオブジェクトを処理 (バックグラウンド) します。
  3. オブジェクトが処理されるときに (背景) オブジェクトを挿入します。
  4. 必要に応じて、追加するすべての X オブジェクトの UI を (メイン スレッドから) 更新します。

ダウンロードは (ほとんどの場合、注を参照) ネットワークにバインドされているため、CPU は何秒間もアイドル状態になります。次のステップ (処理) が CPU バウンドになることを考えると、これは時間の無駄です。その後のステップは I/O バウンド (データベース) になる可能性が高いため、なおさらです。

アプリケーション ユーザーに進行状況のフィードバック (データまたは進行状況バーの表示) を提供しながら、3 つのタスクすべてを同時に実行することをお勧めします

注 #1: gzipされた応答はより速くダウンロードされます。OTOHローカルで解凍するには、余分な(CPU)時間がかかります。高速である必要がありますが、両方のオプションを測定する価値があります (たとえば、Xamarin.iOS とうまく連携する Apple のインストルメント ツールを使用します)。

注 #2:応答としてのzipファイルも、(解凍するために) 余分な時間が必要になります。これは、ダウンロード後に順番に実行したいことではありません (ただし、ダウンロード時に圧縮を解除することはできます)。

于 2013-06-20T13:30:02.000 に答える