2016-09-04 32 views
5

Son zamanlarda, PCL ListView'ımda sonsuz kaydırma/tembel yükleme yapmak zorunda kaldım. Ben kod çoğunu bırakacaktır, ama en önemli parçası oldu:Xamarin Formlar: ObservableCollection her zaman kullanıcı arabiriminde ayarlanmalı/güncellenmeli?

ViewModel

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

Bu Android'de iyi iş gibi görünüyordu, ama iOS'ta, ben menzil istisnalar özellikle çıkıyorum tuttu listeyi hızlıca kaydırdığımda. Düzeltme benim için bu kodu ana kullanıcı arabiriminde çalıştırıyordu.

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

Sorum artık tüm görünüm modeli hizmeti daima UI iş parçacığı olarak yapılmak güncelleme veya ayarlanmış bir gözlemlenebilir koleksiyon çağırır gerektiği nedir?

Countries ayarlanmış birkaç komutum var. UI thread bloğu olmadan iyi çalışıyorlar. Ben sadece yukarıda belirtildiği gibi öğeleri ekleyerek ile sorunları vardı.

ObservableCollection her zaman kullanıcı arabiriminde ayarlanmalı ve güncellenmeli mi?

cevap

1

GözlemlenebilirKoleksiyonun kendisi iş parçacığı güvenli değildir. Ancak, , UI Görüntülemelerinin kod güncelleştirme özellikleri UI iş parçacığı üzerinde çalıştırılacağından ViewModel özelliklerini (bunlar arasında GözlemlenebilirKoleksiyonlar) değiştiremez. Xamarin kendisi ile ilgilenecek. Dişli güvenli ObservableCollection kullanmayı deneyin.

+0

Teşekkürler. Xamarin iş parçacığı anahtarını işliyorsa, neden Thread-safe ObservableCollection kullanmalıyım? – Mark13426

+0

Çünkü ** siz onu farklı konulardan değiştirmek isteyebilirsiniz. – nicks

+0

, Xamarin'in UI iş parçacığı üzerinde UI nesnelerini (VM'deki değişikliklere bağlı olarak) güncelleştireceğini garanti eder. VM'yi aynı iş parçacığında güncellemeniz veya iş parçacığı güvenli nesneleri kullanmanız size kalmış. – nicks