2017-09-13 8 views
1

私はモバイル開発とXamarinが比較的新しいです。私は彼らが完全にREST APIに依存しているアプリを作っています。アプリの周りをクリックすることはかなり速いのに、一定の負荷のために非常に悪い経験であることは非常に明白です。(Xamarin)アプリのREST呼び出しのためのローカルプリロードとキャッシングレイヤーが待ち時間を短縮しますか?

私が考案した解決策は、ユーザーがアプリケーションを読み込んだときに多くのエンドポイントを取得してから、しばらくキャッシュすることです。

私はこれを簡単に実装することができますが、私はREST APIを使用するすべての単一のアプリケーションを想定した問題のためにホイールを再投資することになります。

だから私の質問はです:

(Xamarin)アプリケーションで、キャッシュRESTデータをプリロードするための最も一般的なアプローチは何ですか?

アプリのローカルサービスエリア間にキャッシュレイヤーを作成し、ユーザーが開くと予想されるエンドポイントをキャッシュする非同期タスクを開始しますか?

答えて

1

キャッシュベースのレイヤーを作成できます。あなたは、それがメモリのみ、またはメモリとディスクの両方に永続化したいかどうかを検討する必要があります。

私は、マルチレベル(メモリ、ディスク、ネットワーク)キャッシュシステムを提示します。私はこのアーキテクチャを成功裏に使用しました。シングルトンクラスとC#イベントで動作します。ハンドラには多くのサブスクライバ が存在します。したがって、UI画面は、データが利用可能なときに受信することができ、要求ごとに数回 を呼び出すことができます。デザインは、できるだけ早くデータを返すように設計されています(メモリから先に)が、データを更新するためにディスクとネットワークの呼び出しを行います。 UIは、メモリからのデータを素早くコールし、ネットワーク要求が完了したら再度コールバックするため、何度もコールバックされる可能性があります。スレッドの安全性を助けるために、ロックを使用するか、ConcurrentDictionaryやConcurrentQueueのようなスレッドセーフなコレクションを使用できます。考慮すべき多くのエッジケースがありますが、これはイベントを持つマルチレベルキャッシュシステムの基本アーキテクチャです。

// pseudo code 
class CacheHelper 
{ 

    // todo: create singleton 

RequestData() 
{ 

    if (data in memory) 
    { 
     // this quickly gets the app some data 
     Fetch data from dictionary/list/etc 
     NotifySubscribers(this, data) 
    } 

    if (data in disk) 
    { 
     // this gets data persisted after user force closes app then reopens 
     Fetch data from sqlite, file storage, etc 
     NotifySubscribers(this, data) 

     copy data from disk to memory 
    } 

    // always request data from server too to keep it fresh 
    RequestLatestDataFromServer(); // you can put a cap on this to limit network requests 
} 

HandleRequestLatestDataFromServerComplete(obj, args) 
{ 
    // this is the data returned from server 
    ALSO copy server result to memory and copy to disk 

    NotifySubscribers(this, data); 

} 



/// To use this in a UI class 
ViewDidAppear() 
{ 
    CacheHelper.Instance.HandleRequestLatestDataFromServerComplete += ReceivedData; 
} 

ViewWillDisappear() 
{ 
    CacheHelper.Instance.HandleRequestLatestDataFromServerComplete -= ReceivedData; 
} 


void ReceivedData(Object obj, EventArgs args) 
{ 
    // update your UI 
    // This may get called a few times, for each level of cache retrieved 
} 
+0

また、キャッシュシステムについては、https://github.com/akavache/Akavacheに適合している場合でも、Akavacheをご覧ください – jaybers

関連する問題