Cocoa touch 中央调度台。使用类似于[myView setNeedsDisplay]的GCD[spinner startAnimating]时?

Cocoa touch 中央调度台。使用类似于[myView setNeedsDisplay]的GCD[spinner startAnimating]时?,cocoa-touch,ios5,grand-central-dispatch,uiactivityindicatorview,Cocoa Touch,Ios5,Grand Central Dispatch,Uiactivityindicatorview,在Grand Central Dispatch中,我想在开始长时间运行任务之前启动旋转器-UIActivityIndicatorView-旋转: dispatch_async(cloudQueue, ^{ dispatch_async(dispatch_get_main_queue(), ^{ [self spinnerSpin:YES]; }); [self performLongRunning

在Grand Central Dispatch中,我想在开始长时间运行任务之前启动旋转器-
UIActivityIndicatorView
-旋转:

dispatch_async(cloudQueue, ^{

    dispatch_async(dispatch_get_main_queue(),
            ^{
                [self spinnerSpin:YES];
            });

    [self performLongRunningTask];

    dispatch_async(dispatch_get_main_queue(),
            ^{
                [self spinnerSpin:NO];
             });


});
以下是
喷丝头旋转
方法:

- (void)spinnerSpin:(BOOL)spin {

    ALog(@"spinner %@", (YES == spin) ? @"spin" : @"stop");

    if (spin == [self.spinner isAnimating]) return;

    if (YES == spin) {

        self.hidden = NO;
        [self.spinner startAnimating];
    } else {

        [self.spinner stopAnimating];
        self.hidden = YES;
    }

}
有一件事我从未见过有人讨论过,那就是
[myView setNeedsDisplay]
[myActivityIndicatorView startAnimating]
之间的区别(如果有的话)。他们的行为相同吗

谢谢,

Doug

方法
[UIView setNeedsDisplay]
UIActivityIndicatorView
的动画状态无关

setNeedsDisplay
只是通知系统该视图的状态已更改,从而使其当前绘制的表示无效。换句话说,它要求系统在下一个绘图周期调用该视图的
drawRect
方法

您很少需要从视图外部,从使用视图的代码调用
setNeedsDisplay
。每当视图的内部状态发生变化,需要重新绘制视图时,视图的内部逻辑代码就会调用此方法

[UIActivityIndicatorView startAnimating]
方法特定于
UIActivityIndicatorView
类,只要求指示器开始设置动画(例如旋转)。此方法是即时的,无需调用任何其他方法

另一方面,只需调用
startAnimating
stop animating
即可简化代码,而无需手动显示/隐藏它。
UIActivityIndicatorView
类有一个默认为
YES
hidesWhen-stopped
布尔属性,这意味着微调器在开始设置动画时会显示自己,在停止设置动画时会隐藏自己

因此,您的
spinnerSpin:
方法可以这样重构(只要您没有将
hidesWhenStopped
属性设置为
NO
):


我建议从这个问题中删除
grandcentraldispatch
标签,因为它与GCD无关。此外,更通用的
ios
标记可能比
ios5
更合适,因为
UIActivityIndicatorView
类从一开始就存在。我不确定是否遵循。GCD是Grand Central Dispatch的首字母缩写。否?此外,如果内存可用,则在iOS4之前GCD不可用,因此使用iOS标记是不正确的。即使您的特定场景涉及到Grand Central Dispatch(也称为GCD),您的问题是[UIView setNeedsDisplay]和[UIActivityIndicatorView startAnimating]之间的区别,这与GCD无关。这个问题可以在根本不提及GCD的情况下提出,答案仍然是一样的。相反。我的问题基本上是关于GCD上下文中UI更新的行为。此外,基本级别的微调器行为是一种UI更新行为,因此与此相关。我还建议将
dispatch\u async(dispatch\u get\u main\u queue())
调用移动到
spinnerSpin:
方法,这样就可以从代码中的任何位置调用它,而不必显式地将其分派到主队列。
- (void)spinnerSpin:(BOOL)spin {
    if (YES == spin) {
        [self.spinner startAnimating];
    } else {
        [self.spinner stopAnimating];
    }
}