停止UIACtivityIndi​​catorView气质的iOS

问题描述:

我使用异步停止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更新,如果您还没有这样做.. –

两个主要问题:

  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

如果从主线程调用NSURLConnection,那么你完成处理器也将被从主线程调用。因此,停止微调器时不应调用dispatch_sync

+0

我改变它dispatch_async,这似乎工作将做一些更多的测试。 –

+0

在这种情况下,我认为你完全不需要使用GCD,因为完成处理程序已经在主线程中。所以,只需调用[self stopAnimatingSpinner]即可。 – sixthcent

+0

恐怕不是因为我一直这样做,这个问题的原因有时会引发其他人不是这个异步是最稳定的,直到没有和尚未工作,但将继续测试它。 –