如何在ReactiveUI中创建可主动推送值的IObservable对象?
你要的功能是Rx.NET基础库的原生实现,ReactiveUI基于Rx.NET构建,直接使用对应的内置类型即可,不需要用Observable.FromEvent做兼容处理。
基础场景用
Subject<T>
它同时实现了IObservable<T>和IObserver<T>接口,你需要的手动推送新值能力对应它的OnNext(T value)方法,调用后所有订阅者都会收到新值,完全符合需求。
示例代码:// 实例化Subject var numberSubject = new Subject<int>(); // 作为IObservable订阅 numberSubject.Subscribe(value => Console.WriteLine($"接收到新值:{value}")); // 手动推送新值 numberSubject.OnNext(1024); // 所有订阅者都会收到1024需要保留最新值给新订阅者用
BehaviorSubject<T>
如果期望后续新加入的订阅者能直接收到最近一次推送的值,可以用BehaviorSubject<T>,创建时需要指定初始值:
示例代码:// 初始化时指定默认值为0 var statusSubject = new BehaviorSubject<int>(0); // 首次订阅直接收到初始值0 statusSubject.Subscribe(v => Console.WriteLine($"订阅1收到值:{v}")); statusSubject.OnNext(1); // 已存在的订阅都会收到1 // 后续新订阅直接收到最近一次推送的1 statusSubject.Subscribe(v => Console.WriteLine($"订阅2收到值:{v}"));需要适配ReactiveUI调度体系用
ScheduledSubject<T>
如果推送的值需要绑定到UI更新,你可以用ReactiveUI提供的ScheduledSubject<T>,指定调度器后通知会自动在对应线程触发,避免跨线程操作UI的异常:
示例代码:// 指定用主线程调度器触发订阅回调 var uiNotifySubject = new ScheduledSubject<string>(RxApp.MainThreadScheduler);
以上都是Rx生态的标准实现,比Observable.FromEvent的封装方案更轻量,也符合响应式编程的设计规范。
内容的提问来源于stack exchange,提问作者Mason Wheeler
相关产品推荐
相关产品推荐

