Xamarin.iOS
Programowanie równoległe w Xamarin.iOS
Szukaj…
Manipulowanie interfejsem użytkownika z wątków w tle
Wątki w tle nie mogą modyfikować interfejsu użytkownika; prawie wszystkie metody UIKit muszą być wywoływane w głównym wątku.
Z podklasy NSObject
(w tym dowolnego UIViewController
lub UIView
):
InvokeOnMainThread(() =>
{
// Call UI methods here
});
Ze standardowej klasy C #:
UIApplication.SharedApplication.InvokeOnMainThread(() =>
{
// Call UI methods here
});
InvokeOnMainThread
czeka na wykonanie kodu w głównym wątku przed kontynuowaniem. Jeśli nie musisz czekać, użyj BeginInvokeOnMainThread
.
Używając Async i czekaj
Do obsługi wykonywania asynchronicznego można użyć metod asynchronicznych. Na przykład żądania POST i GET. Powiedzmy, że poniżej jest twoja metoda pobierania danych.
Task<List> GetDataFromServer(int type);
Możesz wywołać tę metodę, jak pokazano poniżej
var result = await GetDataFromServer(1);
Jednak w praktyce dzień ten będzie w interfejsie warstwy usług. Najlepszym sposobem na to jest utworzenie osobnej metody wywołania tego i zaktualizowanie interfejsu użytkownika pokazanego poniżej.
//Calling from viewDidLoad
void async ViewDidLoad()
{
await GetDataListFromServer(1);
//Do Something else
}
//New method call to handle the async task
private async Task GetArchivedListFromServer(int type)
{
var result = await GetDataFromServer(type);
DataList.AddRange(result.toList());
tableView.ReloadData();
}
W powyższym fragmencie kodu zostanie wywołana metoda GetDataListFromServer, która wyśle żądanie sieciowe. Niemniej jednak nie zablokuje wątku interfejsu użytkownika, dopóki nie otrzyma odpowiedzi z serwera. await GetDataListFromServer(1)
się w dół linii po await GetDataListFromServer(1)
. Jednak w ramach private async Task GetArchivedListFromServer(int type)
będzie czekał, aż otrzyma odpowiedź z serwera, aby wykonać wiersze po var result = await GetDataFromServer(type);
.