如何为 ios 实施 System.Reactive 调度程序

How to implement a System.Reactive scheduler for ios

我在我的 ios 项目中使用 System.Reactive,我知道我需要使用 ObserveOn 来指定在哪个线程上执行订阅者。但是我似乎无法正常工作。

据我所知,这应该是可行的,还是我实施错了?

public class UiContext : IScheduler
{
    /// <inheritdoc />
    public IDisposable Schedule<TState>(TState state, Func<IScheduler, TState, IDisposable> action)
    {
        NSOperationQueue.MainQueue.AddOperation(() => action(this, state));
        return Disposable.Empty;
    }

    /// <inheritdoc />
    public IDisposable Schedule<TState>(TState state, TimeSpan dueTime, Func<IScheduler, TState, IDisposable> action)
    {
        NSOperationQueue.MainQueue.AddOperation(() => action(this, state));
        return Disposable.Empty;
    }

    /// <inheritdoc />
    public IDisposable Schedule<TState>(TState state, DateTimeOffset dueTime, Func<IScheduler, TState, IDisposable> action)
    {
        NSOperationQueue.MainQueue.AddOperation(() => action(this, state));
        return Disposable.Empty;
    }

    /// <inheritdoc />
    public DateTimeOffset Now { get; }
}

    void SomeMethod()
    {
        WhenValidationChanged
            .ObserveOn(new UiContext())
            .SubscribeOn(new UiContext())
            .Throttle(TimeSpan.FromMilliseconds(50))
            .Subscribe(OnValidationChanged);
    }

    private void OnValidationChanged(object obj)
    {
        if (TableView.DataSource is InfoFieldsDataSource dataSource)
        {
            var validationErrors = dataSource.Items.OfType<InfoFieldViewModelBase>().Count(d => !d.IsValid);
            // Exception is raised about not being executed on UI thread
            _validationController.View.BackgroundColor = validationErrors > 0 ? UIColor.Green : UIColor.Red;
        }
    }

.Throttle(TimeSpan.FromMilliseconds(50)) 之前调用 .ObserveOn(new UiContext()) 可能没有任何效果,因为 Throttle 可以更改调度程序 - 每个操作员都可以更改调度程序。您应该始终在要应用它的操作员或订阅呼叫之前执行 .ObserveOn