2012-07-11 46 views
1

我試圖在用戶在模態視圖控制器中按下「登錄」後顯示UIAlertViewUIActivityIndicator。要登錄,憑證將使用NSURLConnection類中的sendAsynchronousRequest:queue:completionHandler:發送到服務器。我的實現如下:UIAlertView,NSURLConnection和wait_fences

UIAlertView * spinner = [[UIAlertView alloc] initWithTitle:@"Connecting to server..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil]; 
[spinner show]; 
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
indicator.center = CGPointMake(spinner.bounds.size.width * 0.5f, spinner.bounds.size.height * 0.5f+5.0f); 
[indicator startAnimating]; 
[spinner addSubview:indicator]; 
[indicator release]; 

[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * res, NSData * data, NSError * err) { 
    [spinner dismissWithClickedButtonIndex:0 animated:YES]; 
    [spinner release]; 
    ... 
} 

這似乎很好地工作,如果服務器無法到達或者服務器很慢,但如果服務器回覆立刻,微調似乎並沒有被解僱以後才3-5秒的控制檯記錄

wait_fences: failed to receive reply: 10004003 

我想這是因爲我解僱一個模式視圖控制器(登錄屏幕),而UIAlertView仍呈現,但我不知道爲什麼會這樣,因爲通常應該被解僱。我做錯了什麼,做這件事的正確方法是什麼?

回答

3

我已經多次看到這個日誌 - 它總是由內部動畫框架中的意外狀態或默認視圖動畫之間的碰撞引起的。

可能的原因:

  1. 從內viewDidLoadviewWillAppear或類似的方法啓動動畫 - 前實際顯示的視圖。
  2. 當另一個UIAlertView動畫仍在運行時,顯示/隱藏UIAlertView。這包括顯示來自alertView:didDismissWithButtonIndex:的警報。
  3. 模態視圖動畫和警報動畫之間的碰撞。
  4. UINavigationController推/爆動畫和警報動畫之間的衝突。

你的情況下:你可能隱藏甚至在它已經充分展示您的警報,你會得到兩個動畫之間的衝突。顯示的動畫通常需要大約0.4秒,但您的響應可以早得多 - 觸發隱藏動畫。

可能的解決辦法:

  1. 觸發請求時,動畫結束(didPresentAlertView)。
  2. 測量連接的持續時間,如果它小於0.4秒,則延遲隱藏動畫。
+0

+1不錯的答案。乾杯。 – 2012-07-11 12:37:24

+0

感謝您的快速回復。我會研究didPresentAlertView方法,並接受這個答案,如果這似乎解決它。 – Warkst 2012-07-11 14:11:35

+0

由於我的程序的異步性質,我在另一個問題上解決了這個問題,但問題確實是你所描述的問題:我不得不再等一會兒才能解僱。我現在使用dispatch_after和一個包含我舊解僱代碼的塊,不僅我的程序響應更快,而且UI wait_fences錯誤也消失了!感謝您的解釋。 – Warkst 2012-07-12 09:25:35

0

如果沒有出現該動畫發生的視圖控制器,則不應該執行動畫。所以在viewDidLoad中沒有動畫。嘗試viewDidAppear。這更安全。看看here

希望這會有所幫助。

乾杯!