2016-09-04 61 views
5

最近,我不得不在我的PCL ListView上實現無限滾動/延遲加載。我離開了大部分的代碼,但最重要的部分是:Xamarin表單:應該總是在UI線程中設置/更新ObservableCollection嗎?

視圖模型

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

這似乎在Android上正常工作,但在iOS上,我一直得到超出範圍的異常特別的當我快速滾動列表時。對我來說,修補程序是在主UI線程中運行此代碼。

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

我現在的問題是所有的視圖模型服務調用應該更新或設置一個可觀察的集合總是在UI線程中執行嗎?

我有幾個命令,設置Countries。他們似乎沒有UI線程塊正常工作。我只有加上項目的問題,如上所述。

應該在UI線程中始終設置和更新ObservableCollection?

回答

1

ObservableCollection本身不是線程安全的。但是,您可以從可以更改ViewModel屬性(其中ObservableCollections)從非UI線程,因爲UI視圖本身的代碼更新屬性將在UI線程上運行。 Xamarin會自己照顧它。嘗試使用線程安全的ObservableCollection

+0

謝謝。如果Xamarin處理線程切換,爲什麼我應該使用線程安全的ObservableCollection? – Mark13426

+0

因爲**你**可能想從不同的線程修改它。 – nicks

+0

它確保Xamarin將在UI線程上更新UI對象(基於VM中的更改)。你可以在同一個線程上更新虛擬機,或者使用線程安全的對象。 – nicks