UIAlertView:wait_fences:未能收到回复:10004003

时间:2011-03-04 11:27:58

标签: iphone xamarin.ios uialertview

我正在后台运行网络请求,我希望用户能够取消此请求。在Web请求运行时,我使用带有“取消”按钮的UIActionSheet。当Web请求返回错误时,我通过调用DismissWithClickedButtonIndex(0,true)来关闭UIActionSheet。然后我显示一个带有错误消息的UIAlertView以及取消或重试Web请求的选项。

大部分时间一切正常,但有时我在控制台输出窗口中收到“wait_fences:无法接收回复:10004003”消息,顺便提一下,有一些奇怪的UI行为。

我做了一些搜索,发现这是由于在将控件转移到UIAlertView之前,底层视图无法获得控制。有些人建议使用PerformSelector延迟显示AlertView。这是正确的解决方案吗?如果是这样,我如何将UIAlertView的Show方法转移到PerformSelector方法的第一个参数?

目前我使用此解决方案进行延迟:

private void StartAfterParentViewUpdate(NSAction action)
{
    NSAction delayedAction = () => BeginInvokeOnMainThread(action);
    NSTimer.CreateScheduledTimer(new TimeSpan(0, 0, 0, 0, 200), delayedAction);
}

这样我可以调用StartAfterParentViewUpdate(_alertView.Show),我想它一旦线程可以处理它就会在主UI线程上运行。这是正确的还是有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

回答我自己的问题:解决方案运行良好,我再也没有看过wait_fences消息。我在任何一个类中都使用了一个静态助手:

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

如果需要延迟调用带参数的方法,请使用匿名委托。例如:

    NSAction action = () => { viewController.NavigationController.PopViewControllerAnimated(true); };
    UIHelper.StartAfterParentViewUpdate(viewController, action);