2011-03-04 18 views
1

私はバックグラウンドでWebリクエストを実行していますので、このリクエストをキャンセルすることができます。私は、Web要求が実行されている間、キャンセルボタンを含むUIActionSheetを使用します。 Webリクエストがエラーを返すと、DismissWithClickedButtonIndex(0、true)を呼び出してUIActionSheetを閉じます。次に、UIAlertViewにエラーメッセージと、Webリクエストをキャンセルまたは再試行するオプションを表示します。UIAlertView:wait_fences:返信の受信に失敗しました:10004003

ほとんどの場合、ほとんどの場合うまく動作しますが、コンソール出力ウィンドウに "wait_fences: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スレッド上で実行されます推測します。これは正しいですか、この問題を解決する良い方法がありますか?

答えて

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