2017-05-23 6 views
2

短いバージョン:Akavacheを追加せずに自分のコード(https://github.com/akavache/Akavache/blob/501b397d8c071366c3b6783aae3e98695b3d7442/src/Akavache/Portable/JsonSerializationMixin.cs#L202)でAkavacheのようなGetAndFetchLatestメソッドを実装するにはどうすればいいですか?できるだけ早くリクエストと結果を得る

ロングバージョン: 私はディスクからTのリストを返すメソッドがあり、HTTPサービスから同じタイプのList<T>を返すメソッドがあります。 両方とも非同期でラップされますTask<List<T>>

私のビューモデルでは、Observable<List<T>>を返す1つのメソッドを呼びたいと思います。

私のViewModelでは、.Subscribe()メソッドを使用してUIを更新します。 本質的に私は、データが利用可能であることを2回通知する必要があり、購読のコードも2回行われることになります。

この機能は、GetAndFetchLatestメソッドの形でAkavacheで利用できますが、私は自分の2データメソッド呼び出しで自分自身を実装する方法を理解するために、RXの流暢さにはほど遠いところです。

注:私は両方のタスクを待っていません!私は同時にデータを返すとすぐに両方を起動したいと、Observableに通知します。

ヒント? GetFromWeb仕上げGetFromDisk前に、その場合には、私はあなたが無視したいと仮定していますとは考えにくいが、可能なシナリオに対応していないこと、しかし

var merged = Observable.Merge(
    GetFromWeb().ToObservable(), 
    GetFromDisk().ToObservable() 
); 

//Same thing using extension syntax 
var simply = GetFromWeb().ToObservable() 
    .Merge(GetFromDisk().ToObservable()); 

答えて

3

考えるTask<List<T>> GetFromWeb()Task<List<T>> GetFromDisk()は、簡単な答えはこれですGetFromDiskの結果です。それを処理するには、いくつかの体操を必要とするつもりだ:

public IObservable<T> Prioritize<T>(params IObservable<T>[] orderedByDescendingPriority) 
{ 
    return orderedByDescendingPriority 
     .Select((o, i) => o.Select(item => Tuple.Create(orderedByDescendingPriority.Length - i, item))) 
     .Merge() 
     .Select(t => new Func<Tuple<int, T, bool>, Tuple<int, T, bool>>(t2 => Tuple.Create(Math.Max(t2.Item1, t.Item1), t.Item2, t.Item1 >= t2.Item1))) 
     .Scan(Tuple.Create(0, default(T), false), (t, f) => f(t)) 
     .Where(t => t.Item3) 
     .Select(t => t.Item2); 
} 

var merged = Prioritize(
    GetFromWeb().ToObservable(), 
    GetFromDisk().ToObservable() 
); 

EDIT

あなたは常にGetFromWebが、それは簡単なConcat操作だ前にGetFromDiskを常に表示したい場合。これは、.NETタスクが関数を参照するとすぐに自動的に開始されるためです。

var t1 = GetFromDisk(); 
    var t2 = GetFromWeb(); 

    var merged = Observable.Concat(
     t1.ToObservable(), 
     t2.ToObservable() 
    ); 
+0

これは有望です!私はこれを試してみよう... – Depechie

+0

fromDebの結果がプッシュされた後、fromWebの結果を優先させるのではなく、延期する方法がありますか? fromWebの開始とともに待つのではなく、fromDiskのものがプッシュされた後に結果をobservableに追加するのを待つか? – Depechie

+0

これは同時に開始リクエストであり、 'FromDisk'がどれほどの時間を要しても、常に最初に出てくるでしょうし、できるだけすぐに' FromWeb'が来ますか? – Shlomo

関連する問題