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); .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow