2017-12-15 2 views
0

Angenommen, ich habe eine teure Berechnung, die ein Objekt erstellt. Ich möchte dem Anrufer etwas Flexibilität geben, wo das passiert, mit subscribeOn(). Aber ich möchte diese Berechnung wegen Nebeneffekten auch nicht mehr als einmal durchführen (z. B. wird das Objekt von einem externen Datenspeicher unterstützt).Wie memotiere ich den Wert, der von einem Single ausgegeben wird?

kann ich

MyObject myObject = MyObject.createExpensively(params); 
return Single.just(myObject); 

aber das macht die teure Arbeit an dem aufrufenden Thread schreiben.

kann ich

Callable<MyObject> callable =() -> MyObject.createExpensively(params); 
return Single.fromCallable(callable); 

schreiben, aber dies wird createExpensively() (mit Nebenwirkungen) einmal pro Abonnement, rufen Sie das nicht, was ich will, wenn es mehrere Abonnenten sind.

Wenn ich sicherstellen möchte, dass createExpensively() nur einmal aufgerufen wird, und seine Nebenwirkungen nur einmal auftreten, was ist das Muster, das ich hier suche?

+0

Haben Sie sich [Single.Cache()] (http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Single.html#cache--) angesehen? – akarnokd

+0

Singleton-Muster? – tolpp

+0

@akarnokd Wie würde das funktionieren - 'Single.fromCallable (c) .cache()'? Wenn ja, mach es eine Antwort und ich werde es akzeptieren. –

Antwort

1

könnten Sie Single.cache() verwenden:

Single.fromCallable(() -> MyObject.createExpensively(params)).cache(); 
1
Single.fromCallable(() -> MyObject.createExpensively(params)).cache(); 

Cache() -> Speichert den Erfolg Wert oder eine Ausnahme von der aktuellen Single- und Replays es zu spät SingleObservers. Bitte werfen Sie einen Blick auf here für weitere Informationen.

+0

Bitte fügen Sie eine Beschreibung hinzu, wie dies das Problem lösen wird. – Vagish

Verwandte Themen