सभी MvvmCross प्लेटफार्मों की आवश्यकता है कि यूआई-कार्यों यूआई धागा/अपार्टमेंट के लिए पीठ पर मार्शल हो - लेकिन एक मंच इस अलग ढंग से करता है ....
इस हल करने के लिए, MvvmCross एक पार मंच तरीका प्रदान करता है ऐसा करने के लिए - एक IMvxViewDispatcherProvider
इंजेक्शन ऑब्जेक्ट का उपयोग करना।
उदाहरण के लिए, WindowsPhone IMvxViewDispatcherProvider
पर अंततः MvxMainThreadDispatcher
द्वारा https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.WindowsPhone/Views/MvxMainThreadDispatcher.cs
में प्रदान की जाती है यह InvokeOnMainThread
लागू करता है का उपयोग करते हुए:
private bool InvokeOrBeginInvoke(Action action)
{
if (_uiDispatcher.CheckAccess())
action();
else
_uiDispatcher.BeginInvoke(action);
return true;
}
कोड के लिए ViewModels में:
- अपने
ViewModel
inherits MvxNotifyPropertyChanged
वस्तु एक MvxNotifyPropertyChanged
- से
MvxViewModel
MvxViewModel
inherits एक MvxApplicationObject
MvxApplicationObject
inherits से से एक MvxMainThreadDispatchingObject
MvxMainThreadDispatchingObject
से विरासत https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross/ViewModels/MvxMainThreadDispatchingObject.cs
public abstract class MvxMainThreadDispatchingObject
: IMvxServiceConsumer<IMvxViewDispatcherProvider>
{
protected IMvxViewDispatcher ViewDispatcher
{
get { return this.GetService().Dispatcher; }
}
protected void InvokeOnMainThread(Action action)
{
if (ViewDispatcher != null)
ViewDispatcher.RequestMainThreadAction(action);
}
}
तो है ... आपकै विचार मॉडल सिर्फ नोट करने के लिए InvokeOnMainThread(() => DoStuff());
एक आगे की बात कॉल कर सकते हैं कि MvvmCross स्वचालित रूप से RaisePropertyChanged()
तरीकों के माध्यम से जो (किसी भी MvxNotifyPropertyChanged
वस्तु में या वास्तव में) में एक MvxViewModel
संकेत कर रहे हैं संपत्ति अद्यतन के लिए यूआई धागा रूपांतरण करता है - देखें:
protected void RaisePropertyChanged(string whichProperty)
{
// check for subscription before going multithreaded
if (PropertyChanged == null)
return;
InvokeOnMainThread(
() =>
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(whichProperty));
});
}
https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross/ViewModels/MvxNotifyPropertyChanged.cs
इस में
RaisePropertyChanged()
कॉल की स्वचालित मार्शलिंग अधिकांश स्थितियों के लिए अच्छी तरह से काम करती है, लेकिन यदि आप पृष्ठभूमि थ्रेड से बहुत से बदले गए गुणों को बढ़ाते हैं तो यह थोड़ा अक्षम हो सकता है - इससे बहुत सारे थ्रेड संदर्भ स्विचिंग हो सकते हैं। यह कुछ आप अपने कोड के अधिकांश में के बारे में पता होने की जरूरत नहीं है - लेकिन अगर आप कभी भी यह एक समस्या है, तो इसे बदलने के लिए मदद कर सकते हैं कोड की तरह:
MyProperty1 = newValue1;
MyProperty2 = newValue2;
// ...
MyProperty10 = newValue10;
रहे हैं:
InvokeOnMainThread(() => {
MyProperty1 = newValue1;
MyProperty2 = newValue2;
// ...
MyProperty10 = newValue10;
});
क्या तुमने कभी ObservableCollection
उपयोग करते हैं, तो कृपया ध्यान दें MvvmCross करता है कि नहींINotifyPropertyChanged
या INotifyCollectionChanged
घटनाओं इन कक्षाओं से निकाल दिया के लिए प्राथमिकता निर्धारण किसी भी धागा करते हैं - तो यह मार्शल के लिए इन परिवर्तनों एक डेवलपर के रूप आप पर निर्भर है ।
कारण: ObservableCollection
एमएस और मोनो कोड बेस में मौजूद है - इसलिए कोई आसान तरीका नहीं है कि एमवीएमक्रॉस इन मौजूदा कार्यान्वयन को बदल सकता है।
मुझे जीत-फोन में पूरी तरह से यकीन नहीं है, लेकिन क्या आप अपडेट का आह्वान करने के लिए 'Application.Current.Dispatcher' का उपयोग कर सकते हैं? या यह 'परिनियोजन होगा। वर्तमान। डिस्पैचर '? –