【问题标题】:UIAlertView: wait_fences: failed to receive reply: 10004003UIAlertView:wait_fences:未能收到回复:10004003
【发布时间】:2011-03-04 11:27:57
【问题描述】:

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

大部分时间一切正常,但有时我会在控制台输出窗口中收到“wait_fences: failed to receive reply: 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 线程上运行,只要线程可以处理它。这是正确的还是有更好的方法来解决这个问题?

【问题讨论】:

    标签: iphone xamarin.ios uialertview


    【解决方案1】:

    回答我自己的问题:解决方案效果很好,我再也没有看到 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);
    

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2023-03-22
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多