Xamarin.iOS
Programación concurrente en Xamarin.iOS
Buscar..
Manipulación de la interfaz de usuario de hilos de fondo
Subprocesos de fondo no pueden modificar la interfaz de usuario; casi todos los métodos UIKit deben ser llamados en el hilo principal.
Desde una subclase de NSObject
(incluido cualquier UIViewController
o UIView
):
InvokeOnMainThread(() =>
{
// Call UI methods here
});
De una clase estándar de C #:
UIApplication.SharedApplication.InvokeOnMainThread(() =>
{
// Call UI methods here
});
InvokeOnMainThread
espera a que se ejecute su código en el subproceso principal antes de continuar. Si no necesita esperar, use BeginInvokeOnMainThread
.
Usando Async y espera
Puede usar métodos asíncronos para manejar ejecuciones asíncronas. Por ejemplo, las solicitudes POST y GET. Vamos a decir a continuación es su método de obtención de datos.
Task<List> GetDataFromServer(int type);
Puede llamar a ese método como se muestra a continuación
var result = await GetDataFromServer(1);
Sin embargo, en la práctica real, este método estará en una interfaz de capa de servicio. La mejor manera de hacerlo es crear un método separado para llamar a esto y actualizar la IU que se muestra a continuación.
//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();
}
En el fragmento de código anterior, se llamará al método GetDataListFromServer y enviará la solicitud web. Sin embargo, no bloqueará el subproceso de la interfaz de usuario hasta que reciba la respuesta del servidor. Se moverá hacia abajo de la línea después de await GetDataListFromServer(1)
. Sin embargo, dentro del método private async Task GetArchivedListFromServer(int type)
, esperará hasta que reciba la respuesta del servidor para ejecutar las líneas después de var result = await GetDataFromServer(type);
.