Xamarin.iOS
Programmazione simultanea in Xamarin.iOS
Ricerca…
Manipolazione dell'interfaccia utente dai thread in background
I thread in background non possono modificare l'interfaccia utente; quasi tutti i metodi UIKit devono essere richiamati sul thread principale.
Da una sottoclasse di NSObject
(incluso qualsiasi UIViewController
o UIView
):
InvokeOnMainThread(() =>
{
// Call UI methods here
});
Da una classe C # standard:
UIApplication.SharedApplication.InvokeOnMainThread(() =>
{
// Call UI methods here
});
InvokeOnMainThread
attende il codice in esecuzione sul thread principale da eseguire prima di continuare. Se non è necessario attendere, utilizzare BeginInvokeOnMainThread
.
Usare Async e attendere
È possibile utilizzare i metodi asincroni per gestire le esecuzioni asincrone. Ad esempio le richieste POST e GET. Diciamo che sotto è il metodo di acquisizione dei dati.
Task<List> GetDataFromServer(int type);
Puoi chiamare quel metodo come mostrato di seguito
var result = await GetDataFromServer(1);
Tuttavia, nella pratica del giorno reale questo metodo sarà in un'interfaccia del livello di servizio. Lì il modo migliore per farlo è creare un metodo separato per chiamare questo e aggiornare l'interfaccia utente mostrata di seguito.
//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();
}
Nello snippet di codice precedente, il metodo GetDataListFromServer verrà chiamato e invierà la richiesta web. Tuttavia, non bloccherà il thread dell'interfaccia utente finché non riceverà la risposta dal server. Si sposterà lungo la linea dopo aver await GetDataListFromServer(1)
. Tuttavia, all'interno del metodo private async Task GetArchivedListFromServer(int type)
, attenderà fino a quando non ottiene la risposta dal server per eseguire le righe dopo var result = await GetDataFromServer(type);
.