在我看来,我对 RX 函数有很好的“感觉”——我使用了其中的许多函数,或者可以想象其他函数如何有用——但我找不到 .Prune 函数的位置。我知道这是对 AsyncSubject 的多播,但是这在实际场景中有何用处?
编辑:Richard 说 WebRequest 是 Prune() 的一个很好的候选者。我还是不明白怎么办让我们举个例子 - 我想将传入的 uri 转换为图像:
public static IObservable<BitmapImage> ToImage(this IObservable<string> source)
{
var streams =
from wc in source.Select(WebRequest.Create)
from s in Observable
.FromAsyncPattern<WebResponse>(wc.BeginGetResponse,
wc.EndGetResponse)()
.Catch(Observable.Empty<WebResponse>())
select s.GetResponseStream();
return streams
.ObserveOnDispatcher()
.Select(x =>
{
var bmp = new BitmapImage();
bmp.SetSource(x);
return bmp;
});
}
我认为没有必要将 .Prune 附加到 .FromAsyncPattern,因为当您调用 FromAsyncPattern() (很热)时,您会“立即”订阅。
As it 已在 RX 论坛上得到确认 http://social.msdn.microsoft.com/Forums/en-US/rx/thread/8351fadc-7802-48d0-b009-99ab7988b8c2Prune 只是一个便利运算符。
如果您的可观察量具有单个值并且您要发布它,则可以通过对 .Prune() 的单个调用替换 Publish\Connect
所以根据我的经验,Prune 最常见的场景是:
- 你有一个冷的 observable,它会产生副作用并且只发出一个值
- 你有多个订阅者订阅了该可观察的内容,因此你想让它变得热门(因为副作用)
论坛中指出的另一个问题是,当您需要在热可观察对象上缓存特定值时(通常是第一个)。然后您使用 FromEvent(...).Take(1).Prune() ,订阅此内容的任何人都将获得相同的保证值。这不仅仅是“方便”,而且几乎是实现这一结果的唯一简单方法。
毕竟非常有用!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)