iphone - alerta - xamarin forms displayactionsheet
UIAlertView: wait_fences: no se pudo recibir la respuesta: 10004003 (1)
Estoy ejecutando una solicitud web en segundo plano y quiero que el usuario pueda cancelar esta solicitud. Uso una UIActionSheet con un botón Cancelar mientras se ejecuta la solicitud web. Cuando la solicitud web devuelve un error, cierro el UIActionSheet llamando a DismissWithClickedButtonIndex (0, verdadero). Luego muestro un UIAlertView con un mensaje de error y la opción de cancelar o volver a intentar la solicitud web.
Todo funciona bien la mayor parte del tiempo, pero a veces recibo el mensaje "wait_fences: failed to receive reply: 10004003" en la ventana de salida de la consola y, por cierto, hay algún extraño comportamiento de UI.
Hice algunas búsquedas y descubrí que esto es causado por algo así como la vista subyacente no puede obtener el control antes de que el control se transfiera a UIAlertView. Algunas personas sugirieron demorar la visualización de AlertView utilizando PerformSelector. ¿Es esta la solución correcta? Si es así, ¿cómo transfiero el método Show de UIAlertView al primer parámetro del método PerformSelector?
Actualmente utilizo esta solución para el retraso:
private void StartAfterParentViewUpdate(NSAction action)
{
NSAction delayedAction = () => BeginInvokeOnMainThread(action);
NSTimer.CreateScheduledTimer(new TimeSpan(0, 0, 0, 0, 200), delayedAction);
}
De esta forma puedo llamar a StartAfterParentViewUpdate (_alertView.Show) y supongo que se ejecutará en el hilo principal de la interfaz de usuario tan pronto como el hilo pueda manejarlo. ¿Es correcto o hay una mejor manera de resolver este problema?
Para responder a mi propia pregunta: la solución funciona bien, nunca volví a ver el mensaje wait_fences. Hice una ayuda estática para usar desde cualquier clase:
public static class UIHelper
{
public static void StartAfterParentViewUpdate(NSObject parent, NSAction action)
{
NSTimer.CreateScheduledTimer(new TimeSpan(0, 0, 0, 0, 100), () => parent.BeginInvokeOnMainThread(action));
}
// Use this helper method only when action is a non-static member of an object.
public static void StartAfterParentViewUpdate(NSAction action)
{
StartAfterParentViewUpdate((NSObject)action.Target, action);
}
}
Si necesita retrasar la llamada a un método con parámetros, use un delegado anónimo. Ejemplo:
NSAction action = () => { viewController.NavigationController.PopViewControllerAnimated(true); };
UIHelper.StartAfterParentViewUpdate(viewController, action);