Xamarin.iOS
Samtidig programmering i Xamarin.iOS
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);
.