あなたがここで直面している重要な問題は、観測可能なソースが必要なことです。一般に、イベント、デリゲート、タスク、観測可能な拡張の多く(.Interval
または.Generate
など)、および件名からさまざまなソースからオブザーバブルを作成できます。
あなたの場合は、観測値の外部にあるプッシュ値をコードにすることができるソースが必要です。この場合、サブジェクトは完全に問題ありませんが、代理人だけでも使えます。
件名を使用する場合、コードは問題ありません。唯一の欠点は、updateSubject.OnCompleted
と呼んで観察可能な状態に仕上げることができることです。
あなたは、デリゲートを使用したい場合は、あなたのコードは次のようになります。
あなたが
updateGameTime
で行うことができる唯一のことは、新しい
GameTime
に渡している。このように
private Action<GameTime> updateGameTime = null;
public void Initialize()
{
component = new Component();
Observable
.FromEvent<GameTime>(a => updateGameTime += a, a => updateGameTime -= a)
.Subscribe((gameTime) => component.Update(gameTime));
}
public void Update(GameTime gameTime)
{
updateGameTime(gameTime);
}
- あなたがすることができません「偶然"シーケンスを終了します。
ここでは、被験者を使用した場合の問題点はObservable.Create
となり、状態の1つです。あなたのコードでは状態が必要なので、件名はOKです。一般的には可能ですが、可能であれば状態をカプセル化することをお勧めします。これがObservable.Create
です。
(1)
0
-4
16
-48
128
-320
768
-1792
4096
-9216
(2)
0
-4096
16384
-49152
131072
-327680
786432
-1835008
4194304
-9437184
:私は二回、この観測可能に購読している場合、私はこれら二つの配列を取得し
var i = -1;
var query =
Observable
.Range(0, 10).Select(x =>
{
i = -i * 2;
return x * i;
});
:
この例を見てみましょう
シーケンスが変更されました私は州(すなわち、 var i = -1;
)。
私はこの状態を避けることができObservable.Create
でコードを書いていた:
var query =
Observable
.Create<int>(o =>
{
var i = -1;
return
Observable
.Range(0, 10).Select(x =>
{
i = -i * 2;
return x * i;
})
.Subscribe(o);
});
それはまだ同じクエリですが、状態がカプセル化されているので、私は今、二回購読している場合、私は得る:
(1)
0
-4
16
-48
128
-320
768
-1792
4096
-9216
(2)
0
-4
16
-48
128
-320
768
-1792
4096
-9216
複雑なクエリを書くときに、ある件名を使うとずっと簡単になると思うかもしれないし、一般に間違いが起きることもあります。この場合、主語を使用する前に、常に純粋なオペレータのアプローチを見つけようとするべきです。そうでない場合は、Observable.Create
に件名の使用をカプセル化することができます。
外部の状態が必要なため、件名を使用することは問題ありません。
私はSOの最小限の例を示しました。実際のコードはこれより複雑です。 – sdgfsdh
それは良いことです。しかし、これが完全な最小限の検証可能な例であれば、Subject(したがってRx)は冗長です。私はあなたが賢明な答えを提供するのに十分な情報を提供しているとは思わない。 –
私の 'IObservable'が役に立つ入力の例です。 'IObservable 'を持っていれば、' GameTime'ストリームを使ってウィンドウを開くことができます。 –
sdgfsdh