2011-05-20 37 views
1

想象一下,我有一个微调,我必须启用相对较重的事情,然后在任务完成后关闭微调器。做一个需要更新屏幕的任务

如果我做的:

[mySpinner startAnimating]; 
[self doSomethingHeavy]; 
[mySpinner stopAnimating]; 

我将永远不会看到微调运行,因为doSomethingHeavy将锁的线程,绝不让微调表演。

我试图在主线程上使用Grand Central Dispatch for the spinner在另一个任务中尝试启动一个新的队列,但结果是一样的。没有微调运行。

只有这样,才能使其正常工作是一个延迟火的方法,使用

[self performSelector:@selector(doSomethingHeavy) withObject:nil afterDelay:0.02]; 

但是这听起来更像是一个黑客,如果我把[mySpinner stopAnimating]该行之后,任务完成前可能会停止微调。

这不仅适用于微调器,而且适用于需要屏幕更新的任何任务。

回答

0

我已经尝试了这些解决方案,但不幸的是没有工作,因为我的doSomethingHeavy方法也必须在主线程上运行。

使用延迟触发方法的hack工作,但不适用于应该运行多个参数的方法,如performSelector:afterDelay:不能用于传递多个参数。

我发现了一个解决方案,使用Grand Central Dispatch在主线程上激发队列,然后将其休眠0.02秒。使用队列,我可以放任何我想要的东西。

0

希望我在正确理解的问题,但通常我会使用的方法

[self performSelectorInBackground:@selector(doSomethingHeavy) withObject:nil]; 

在这种情况下,因为这叶子免费更新UI,同时在后台仍执行该任务的主线程。

4
... 
    [mySpinner startAnimating]; 
    [self performSelectorInBackground:@selector(doSomethingHeavy) withObject:nil]; 
    ... 
} 


- (void)doSomethingHeavy { 
    ... 

    [mySpinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO]; 
} 

,而不是通过调用停止微调在doSomethingHeavy它会更likley完成或者:

[self performSelectorOnMainThread:@selector(finishedSomethingHeavy) withObject:nil waitUntilDone:NO]; 

这将停止微调和更新与重结果的UI。