Как реализовать планировщик System.Reactive для ios - PullRequest
0 голосов
/ 15 февраля 2019

Я использую System.Reactive в своем проекте ios, и я знаю, что мне нужно использовать 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;
        }
    }

1 Ответ

0 голосов
/ 18 февраля 2019

Вызов .ObserveOn(new UiContext()) до .Throttle(TimeSpan.FromMilliseconds(50)), вероятно, не имеет никакого эффекта, поскольку Throttle может изменить планировщик - каждый оператор может изменить планировщик.Вы всегда должны делать .ObserveOn как раз перед тем, как оператор или абонентский вызов, к которому вы хотите применить его.

...