如何记住 Single 发出的值?
How do I memoize the value emitted by a Single?
假设我有一个创建对象的昂贵计算。我想通过 subscribeOn()
为调用者提供一些灵活性,让调用者可以灵活地决定发生这种情况的位置。但我也不想多次进行该计算,因为有副作用(例如,该对象由某些外部数据存储支持)。
我会写
MyObject myObject = MyObject.createExpensively(params);
return Single.just(myObject);
但这会在调用线程上执行昂贵的工作。
我会写
Callable<MyObject> callable = () -> MyObject.createExpensively(params);
return Single.fromCallable(callable);
但这将调用 createExpensively()
(有副作用)一次 每个订阅,如果有多个订阅者,这不是我想要的。
如果我想确保 createExpensively()
只被调用一次,并且它的副作用只发生一次,我在这里寻找的模式是什么?
你可以使用 Single.cache()
:
Single.fromCallable(() -> MyObject.createExpensively(params)).cache();
Single.fromCallable(() -> MyObject.createExpensively(params)).cache();
cache() -> 存储来自当前 Single 的成功值或异常,并将其重播给后期的 SingleObservers。请查看 here 了解更多信息。
假设我有一个创建对象的昂贵计算。我想通过 subscribeOn()
为调用者提供一些灵活性,让调用者可以灵活地决定发生这种情况的位置。但我也不想多次进行该计算,因为有副作用(例如,该对象由某些外部数据存储支持)。
我会写
MyObject myObject = MyObject.createExpensively(params);
return Single.just(myObject);
但这会在调用线程上执行昂贵的工作。
我会写
Callable<MyObject> callable = () -> MyObject.createExpensively(params);
return Single.fromCallable(callable);
但这将调用 createExpensively()
(有副作用)一次 每个订阅,如果有多个订阅者,这不是我想要的。
如果我想确保 createExpensively()
只被调用一次,并且它的副作用只发生一次,我在这里寻找的模式是什么?
你可以使用 Single.cache()
:
Single.fromCallable(() -> MyObject.createExpensively(params)).cache();
Single.fromCallable(() -> MyObject.createExpensively(params)).cache();
cache() -> 存储来自当前 Single 的成功值或异常,并将其重播给后期的 SingleObservers。请查看 here 了解更多信息。