2016-09-04 15 views
5

Gần đây, tôi đã phải thực hiện cuộn vô hạn/tải chậm trên Danh sách PCL của tôi. Tôi sẽ bỏ qua hầu hết các mã, nhưng phần quan trọng nhất là:Xamarin Forms: ObservableCollection có nên luôn được thiết lập/cập nhật trong chuỗi giao diện người dùng không?

ViewModel

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

này dường như làm việc tốt trên Android, nhưng trên iOS, tôi giữ lấy ra khỏi ngoại lệ phạm vi đặc biệt khi tôi cuộn nhanh danh sách. Bản sửa lỗi cho tôi là chạy mã này trong luồng giao diện người dùng chính.

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

Câu hỏi của tôi bây giờ là tất cả xem cuộc gọi dịch vụ mô hình cập nhật hoặc đặt bộ sưu tập quan sát luôn được thực hiện trong chuỗi giao diện người dùng?

Tôi có một số lệnh rằng đặtCountries. Họ dường như làm việc tốt mà không có khối chuỗi giao diện người dùng. Tôi chỉ gặp sự cố với thêm các mục như đã nêu ở trên.

Nên ObservableCollection luôn được đặt và cập nhật trong chuỗi giao diện người dùng?

Trả lời

1

Quan sátCollection chính nó không phải là an toàn thread. Tuy nhiên, bạn có thể có thể thay đổi thuộc tính ViewModel (ObservableCollections trong số chúng) từ chuỗi không phải UI, vì mã cập nhật các thuộc tính của Giao diện người dùng sẽ được chạy trên chuỗi giao diện người dùng. Xamarin sẽ tự chăm sóc nó. Thử sử dụng an toàn thread ObservableCollection.

+0

Cảm ơn. Nếu Xamarin xử lý chuyển đổi luồng, tại sao tôi nên sử dụng ObservableCollection an toàn cho luồng? – Mark13426

+0

Vì ** bạn ** có thể muốn sửa đổi nó từ các chủ đề khác nhau. – nicks

+0

đảm bảo rằng Xamarin sẽ cập nhật các đối tượng UI (dựa trên các thay đổi trong VM) trên chuỗi giao diện người dùng. tùy thuộc vào bạn để cập nhật VM trên cùng một luồng mặc dù, hoặc sử dụng các đối tượng an toàn thread. – nicks

Các vấn đề liên quan