0

我使用異步停止UIACtivityIndi​​catorView氣質的iOS

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 

我有回調的POST請求時,連接已經停止,在這裏我把我的方法,停止UIActivityIndi​​catorView

-(void)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
NSLog(@"Connection finish"); 
[self stopAnimatingSpinner]; 
} 

繼承人停止動畫方法(我已經嘗試了一種組合,並且所有的下面的停止,刪除隱藏方法

-(void)stopAnimatingSpinner{ 

[submittingActivity stopAnimating]; 
submittingActivity.hidden = YES; 
[submittingActivity removeFromSuperview]; 
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 

} 

現在,問題有時會停止,有時它並不是非常隨機的。如果我將活動的停止移動到完成數據的解析而不是依賴連接回調,則行爲完全相同。有時候他們有時候會停下來呢?

我能想到的唯一的事情是,連接阻塞主線程,但爲什麼它的工作有時而不是別人?

+0

您是否每次都在控制檯上打印「連接完成」? –

+0

@GauravWadhwani是的,我總是得到日誌,所以被稱爲只是用戶界面的方法不會更新..很奇怪,因爲有時它可以幫助別人不是? –

+0

嘗試註釋'removeFromSuperView',然後嘗試..am猜測它可能工作..或者如下面的答案中提到的H2CO3,在主線程上運行UI更新,如果您還沒有這樣做.. –

回答

0

兩個主要問題:

  1. 如果您使用的NSURLConnectionsendAsynchronousRequest:(等)的方法,則僅完成塊將被完成後調用,並且connectionDidFinishLoading:委託方法是沒有的。這是另一個API。

  2. 如果要更新的用戶界面,你應該總是這樣做在主線程上。否則你的程序調用未定義的行爲。所以包裹其停止動畫這是最主要的線程調度塊代碼:

    dispatch_sync(dispatch_get_main_queue(), ^{ [self stopAnimatingSpinner]; });

+0

嗨H2CO3我確實認爲它可能是我會給這個嘗試並報告回來。謝謝 –

+0

這似乎使應用程序崩潰,並變得無反應,即無法做任何事情,沒有在日誌中......我做過之前嘗試... dispatch_async(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),{{0}加工 });但它會在一段時間後停止,但不是當我期望它時? –

+0

@AlexMcPherson我不明白第二個問題,請您重新解釋一下嗎? – 2013-04-13 14:53:15

0

如果從主線程調用NSURLConnection,那麼你完成處理器也將被從主線程調用。因此,停止微調器時不應調用dispatch_sync

+0

我改變它dispatch_async,這似乎工作將做一些更多的測試。 –

+0

在這種情況下,我認爲你完全不需要使用GCD,因爲完成處理程序已經在主線程中。所以,只需調用[self stopAnimatingSpinner]即可。 – sixthcent

+0

恐怕不是因爲我一直這樣做,這個問題的原因有時會引發其他人不是這個異步是最穩定的,直到沒有和尚未工作,但將繼續測試它。 –

相關問題