Переключите UIThreadDispatcher на платформу (Unity), которая не имеет встроенного диспетчера

Я использую mvvmcross с Unity, но у него нет встроенного UIThreadDispatcher, многие пишут, что у него есть диспетчер, у которого нет общего интерфейса. Следующее - моя собственная реализация. Вместо создания другого MvxXXXUIThreadDispatcher, есть ли другой подход?

public abstract class MvxUnityUIThreadDispatcher
: MvxMainThreadDispatcher
{
    protected MvxUnityUIThreadDispatcher()
    {
    }

    public bool RequestMainThreadAction(Action action)
    {
        UIThreadDispatcher.Instance.InvokeOrEnqueueOnMainThread(() => ExceptionMaskedAction(action));

        return true;
    }
}

1 ответ

Диспетчер потоков используется Mvx, чтобы убедиться, что элементы управления пользовательского интерфейса не вызываются в потоках, не связанных с пользовательским интерфейсом.

Если Unity это не нужно, тогда вы можете просто позвонить action() в вашей реализации.

В https://github.com/et-nowis/mvx-unity-ngui MvvmCross реализации похоже, что они использовали SynchronizationContext:

public abstract class MvxUnityUIThreadDispatcher
    : MvxMainThreadDispatcher
{
    private readonly SynchronizationContext _uiSynchronizationContext;

    protected MvxUnityUIThreadDispatcher()
    {
        if (SynchronizationContext.Current == null)
            SynchronizationContext.SetSynchronizationContext(new UnitySynchronizationContext());
        _uiSynchronizationContext = SynchronizationContext.Current;
    }

    public bool RequestMainThreadAction(Action action)
    {
        if (_uiSynchronizationContext == SynchronizationContext.Current)
            action();
        else
            _uiSynchronizationContext.Post(state => ExceptionMaskedAction(action), null);
        return true;
    }
}

из https://github.com/et-nowis/mvx-unity-ngui/blob/master/Assets/External/MvvmCross/Cirrious/Cirrious.MvvmCross.Unity/Views/MvxUnityUIThreadDispatcher.cs - для получения лицензии см. исходный файл условия в этом коде

Другие вопросы по тегам