Sök…


Hantera UI från bakgrundstrådar

Bakgrundstrådar kan inte modifiera användargränssnittet; nästan alla UIKit-metoder måste anropas på huvudtråden.

Från en underklass av NSObject (inklusive alla UIViewController eller UIView ):

InvokeOnMainThread(() =>
{
    // Call UI methods here
});

Från en standardklass C #:

UIApplication.SharedApplication.InvokeOnMainThread(() =>
{
    // Call UI methods here
});

InvokeOnMainThread väntar på att din kod körs på InvokeOnMainThread för att köras innan du fortsätter. Om du inte behöver vänta, använd BeginInvokeOnMainThread .

Använda Async och vänta

Du kan använda asynkmetoder för att hantera asynkrona avrättningar. Till exempel POST- och GET-förfrågningar. Låt säga nedan är din get data-metod.

Task<List> GetDataFromServer(int type);

Du kan ringa den metoden som visas nedan

var result = await GetDataFromServer(1);

I realtidspraxis kommer denna metod emellertid att ligga i ett servicelagergränssnitt. Det bästa sättet att göra det är att skapa en separat metod för att ringa detta och uppdatera UI som visas nedan.

//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();
}

I ovanstående kodavsnitt kommer GetDataListFromServer-metoden att ringas och den skickar webbbegäran. Trots det kommer den inte att blockera UI-tråden förrän den får svaret från servern. Den kommer att röra sig efter linjen efter att await GetDataListFromServer(1) . Men inom den private async Task GetArchivedListFromServer(int type) kommer den att vänta tills den får svaret från servern för att köra raderna efter var result = await GetDataFromServer(type); .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow