Переключите 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 - для получения лицензии см. исходный файл условия в этом коде