2016-09-04 8 views
5

最近、PCL ListViewで無限スクロール/遅延ロードを実装する必要がありました。これは、Android上で正常に動作するように見えますが、iOSの上で、私は特に範囲の例外のうち、取得保管Xamarinフォーム:ObservableCollectionは常にUIスレッドで設定/更新する必要がありますか?

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

のViewModel

:私は、コードの大部分を省略しますが、最も重要な部分でした私はリストをすばやくスクロールしました。私のための修正プログラムは、メインのUIスレッドでこのコードを実行することでした。

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

私の質問は、観察可能なコレクションを更新または設定するすべてのモデルサービスコールを常にUIスレッドで実行する必要がありますか?

を設定したコマンドがあります。Countriesです。彼らはUIスレッドブロックなしで正常に動作するようです。私はに上記のようにの項目を追加するだけの問題がありました。

ObservableCollectionをUIスレッドで常に設定して更新する必要がありますか?

答えて

1

ObservableCollection自体はスレッドセーフではありません。ただし、は、UIビュー自体のプロパティを更新するコードがUIスレッド上で実行されるため、UI以外のスレッドからViewModelプロパティ(ObservableCollections)をUI以外のスレッドから変更することができます。 Xamarinはそれ自体を処理します。スレッドセーフObservableCollectionを使用してください。

+0

ありがとうございました。 Xamarinがスレッド切り替えを処理する場合、なぜスレッドセーフなObservableCollectionを使用する必要がありますか? – Mark13426

+0

**あなた**は別のスレッドから変更する可能性があるためです。 – nicks

+0

Xamarinは、UIスレッド上で(VMの変更に基づいて)UIオブジェクトを更新することが保証されています。同じスレッドでVMを更新するか、スレッドセーフなオブジェクトを使用するかはあなた次第です。 – nicks

関連する問題