2013-09-22 32 views
1

基本上下面的代码的工作原理如下,当我按下按钮时,它会导致两个标签在4秒内同时更新其受尊重的文本。然而,如果我注释掉dispatch_async(dispatch_get_main_queue(),^(void){我的标签仍然更新,但它将采用第一个标签4秒,然后第二个标签在第一个标签后4秒更新,我想知道是否有人可以解释为什么这两个标签更新在4秒与调度代码在一个愚蠢的事情倒可以这么说。我试着听听教程说明,但它只是让我感到困惑,甚至更多。Objective -c:在下面的代码中需要一些关于dispatch_async(GCD)的说明

void (^tFunct1)(UILabel *,NSString*) = ^(UILabel *lbl, NSString *src){ 
NSLog(@"GO TO SLEEP..."); 
sleep(4); 
NSLog(@"WAKING UP..."); 
dispatch_async(dispatch_get_main_queue(), ^(void){ 
[lbl setText:src]; 
NSLog(@"Label Done!"); 
}); 

}; 
-(IBAction)buttonPressed:(id)sender{ 
aConCurrentQue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 
dispatch_async(aConCurrentQue ,^{ tFunct1(self ->lblOne, @"1 GO!"); }); 
dispatch_async(aConCurrentQue ,^{ tFunct1(self ->lblTwo, @"2 GO!"); }); 
} 
+0

似乎很奇怪使用块来调用块内的块。只需使用一种方法。此外,使用' - >'来访问ivars可行,但不是标准约定。只需直接使用他们。 – bbum

回答

0

你总是必须做的UI更新主队列通过注释调度到主队列,你试图在后台全局队列上进行UI更新,这就解释了不正确的行为

UIKit没有设计(有一些非常特殊的ic异常)在后台队列上工作,并且您不应该更新后台队列上的UI。

+0

酷,也只是为了明确调度主阙主要由多线程处理器那样处理,正确吗?对不起,如果我以任何方式听起来无知。一直试图抓住这个问题。 –

+0

@SquidwardTennisballs主队列是一个特殊的串行队列,用于执行应用主线程中的任务。请参阅[关于调度队列](https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW2)因为主队列对于及时的UI更新非常重要,这就是为什么我们派遣任何缓慢的任务到后台队列,不要阻塞这个主队列。但是,就像我们上面所说的那样,UI更新必须在这个主队列上进行。 – Rob

+0

酷,所以使用后台队列来下载或解析通常需要永久存储的图像。 –