2016-09-04 10 views
5

हाल ही में, मुझे अपने पीसीएल लिस्ट व्यू पर अनंत स्क्रॉलिंग/आलसी लोडिंग लागू करना पड़ा। मैं कोड के सबसे को अलग कर देंगे, लेकिन सबसे महत्वपूर्ण हिस्सा था:एक्समरिन फॉर्म: क्या अवलोकन योग्य को हमेशा यूआई थ्रेड में सेट/अपडेट किया जाना चाहिए?

ViewModel

var countries = // get countries 
    foreach (var country in countries) 
    { 
     // Countries is an ObservableCollection<Country> 
     Countries.Add(country); 
    } 

यह एंड्रॉयड पर ठीक काम करने के लिए लग रहा था, लेकिन iOS पर, मैं सीमा अपवाद विशेष रूप से से बाहर हो रही रखा जब मैंने सूची को तेजी से स्क्रॉल किया। मेरे लिए फिक्स मुख्य कोड थ्रेड में इस कोड को चलाने के लिए था।

// wrap the code with this 
Device.BeginInvokeOnMainThread(async() => {}); 

मेरा प्रश्न अब सभी दृश्य मॉडल सेवा है कि अद्यतन या एक नमूदार संग्रह सेट कॉल करना चाहिए हमेशा यूआई सूत्र में क्रियान्वित किया जा रहा है?

मेरे पास कई आदेश हैं जो Countries सेट करें। वे यूआई थ्रेड ब्लॉक के बिना ठीक काम करने लगते हैं। मुझे केवल के साथ समस्याएं मिलीं जो ऊपर बताए गए आइटम जोड़ रही हैं।

क्या अवलोकन करने योग्य चयन हमेशा यूआई थ्रेड में सेट और अपडेट किया जाना चाहिए?

उत्तर

1

पर्यवेक्षण योग्यता स्वयं धागा-सुरक्षित नहीं है। हालांकि आप गैर-यूआई थ्रेड से व्यूमोडेल गुण (उनमें से अवलोकन योग्य चयन) को बदल सकते हैं, क्योंकि यूआई व्यू के कोड अपडेट करने वाले गुण यूआई थ्रेड पर ही चलाए जाएंगे। Xamarin खुद का ख्याल रखेगा। थ्रेड-सुरक्षित ObservableCollection का उपयोग करने का प्रयास करें।

+0

धन्यवाद। यदि ज़ैमरिन थ्रेड स्विचिंग को संभालता है, तो मुझे थ्रेड-सुरक्षित ऑब्जर्जेबल कोलेक्शन का उपयोग क्यों करना चाहिए? – Mark13426

+0

क्योंकि ** आप ** इसे विभिन्न धागे से संशोधित करना चाहते हैं। – nicks

+0

यह गारंटी है कि Xamarin यूआई थ्रेड पर यूआई ऑब्जेक्ट्स (वीएम में बदलावों के आधार पर) अपडेट करेगा। यद्यपि वीएम को उसी धागे पर अपडेट करने के लिए आप पर निर्भर है, या थ्रेड-सुरक्षित ऑब्जेक्ट्स का उपयोग करें। – nicks

संबंधित मुद्दे