在特定于平台的项目中使用 Rx.NET 时
- 人造人
- 苹果
你如何ObserveOn
主线程?使用 Xamarin 时,看起来ObserveOnDispatcher()
在 iOS 或 Android 下不可用。
此示例确实有效,因为我知道我在订阅时在主线程上。我只是不知道是否有更正式的处理方式:"总是"使用主线程,即使我不在主线程上。
myObservable // assume this does work on an alternate thread
.ObserveOn(SynchronizationContext.Current)
.Subscribe(OnMyObservableNext);
同样,如果我在主线程上,比如在单击事件处理程序中,我知道使用SynchronizationContext.Current
会让我回到该线程上。在测试中,我也验证了这一点。
我正在寻找的情况是我可能不在主线程上并且我想回到那里(从 PCL)。
我可以想到一个解决方案,在 iOS 的情况下,我将SynchronizationContext.Current
存储在静态类上,在应用程序委托的FinishedLaunching
方法中。我不知道这是否可取。
上面提到的解决方案是这样的:
个人电脑
namespace MyPCL
{
public static class Settings
{
// obvioulsy probably don't want public setter,
// don't want anyone reaching in here and changiing it
// from under us. But for the example this is fine.
public static SynchronizationContext MainContext { get; set; }
}
}
苹果
using MyPCL;
namespace MyApp.iOS
{
[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
// ...
Settings.MainContext = SynchronizationContext.Current;
// ^^^^ Save the Main SynchronizationContext
// ...
return true;
}
}
}
AFAIK 没有现成的调度程序可供您使用。
你有什么 搭配一些注射剂 http://www.introtorx.com/content/v1.0.10621.0/16_TestingRx.html#SchedulerDI
是我在大多数建议中看到的 在 .net 2.0 中从后台调用 UI 线程的方法
或者如果您使用的是Xamarin表单,只需从订阅中使用它
https://developer.xamarin.com/guides/xamarin-forms/platform-features/device/#Device.BeginInvokeOnMainThread
这不是最漂亮的事情,但它有效
ReactiveUI 确实有一些自定义调度程序实现,用于访问调度程序线程
https://github.com/reactiveui/ReactiveUI/blob/b418df64918da0c78a378af1b846afbab0f4e5ae/src/ReactiveUI/Android/AndroidUIScheduler.cs
https://github.com/reactiveui/ReactiveUI/blob/b418df64918da0c78a378af1b846afbab0f4e5ae/src/ReactiveUI/Cocoa/NSRunloopScheduler.cs
所以你也可以尝试一下,但我不太确定在同步上下文中使用它们的区别/优势