我正在后台运行网络请求,我希望用户能够取消此请求。在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线程上运行。这是正确的还是有更好的方法来解决这个问题?
答案 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);