2011-03-04 40 views
1

我在後臺運行一個web請求,我希望用戶能夠取消這個請求。在Web請求運行時,我使用帶取消按鈕的UIActionSheet。當Web請求返回錯誤時,我通過調用DismissWithClickedButtonIndex(0,true)來關閉UIActionSheet。然後,我顯示一個帶有錯誤消息的UIAlertView,並顯示取消或重試Web請求的選項。UIAlertView:wait_fences:未能收到回覆:10004003

大部分時間都可以正常工作,但有時在控制檯輸出窗口中出現「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線程上只要線程可以處理它運行。這是正確的還是有更好的方法來解決這個問題?

回答

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); 
相關問題