Xamarin.iOS
Gleichzeitiges Programmieren in Xamarin.iOS
Suche…
Manipulieren der Benutzeroberfläche von Hintergrundthreads
Hintergrund-Threads können die Benutzeroberfläche nicht ändern. Fast alle UIKit-Methoden müssen im Hauptthread aufgerufen werden.
Aus einer Unterklasse von NSObject
(einschließlich UIViewController
oder UIView
):
InvokeOnMainThread(() =>
{
// Call UI methods here
});
Aus einer Standardklasse C #:
UIApplication.SharedApplication.InvokeOnMainThread(() =>
{
// Call UI methods here
});
InvokeOnMainThread
wartet, bis der Code im Hauptthread ausgeführt wird, bevor Sie fortfahren. Wenn Sie nicht warten müssen, verwenden Sie BeginInvokeOnMainThread
.
Async verwenden und warten
Sie können asynchrone Methoden verwenden, um asynchrone Ausführungen auszuführen. Zum Beispiel POST- und GET-Anfragen. Nehmen wir an, Sie erhalten Ihre Datenmethode unten.
Task<List> GetDataFromServer(int type);
Sie können diese Methode wie unten gezeigt aufrufen
var result = await GetDataFromServer(1);
In der Praxis wird diese Methode jedoch in einer Service-Layer-Schnittstelle sein. Am besten erstellen Sie hierfür eine separate Methode, um diese aufzurufen und die unten gezeigte Benutzeroberfläche zu aktualisieren.
//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();
}
Im obigen Code-Snippet wird die GetDataListFromServer-Methode aufgerufen und die Webanforderung wird gesendet. Trotzdem wird der UI-Thread nicht blockiert, bis er die Antwort vom Server erhält. Nach dem await GetDataListFromServer(1)
wird die Zeile nach unten await GetDataListFromServer(1)
. Innerhalb der private async Task GetArchivedListFromServer(int type)
-Methode wartet sie jedoch, bis sie die Antwort vom Server erhält, um die Zeilen nach var result = await GetDataFromServer(type);
auszuführen var result = await GetDataFromServer(type);
.