在一个平台,Android或iOS中,应该使用哪个Rx调度器来观察主线程?



在特定于平台的项目中使用 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

所以你也可以尝试一下,但我不太确定在同步上下文中使用它们的区别/优势

相关内容

  • 没有找到相关文章

最新更新