我收到了这段代码
-(void)changeText
{
dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(gqueue, ^(void){
//simulate a network traffic delay
[NSThread sleepForTimeInterval:5];
NSLog(@"start executing");
self.mylabel.text = @"Yeah! Text Changed";
NSLog(@"stop exec");
});
}
问题是,更改标签文本需要花费太多时间。如果我使用主队列,它会立即执行,但UI将被阻止5秒钟。
使用GCD的正确方法是什么,以便我可以在另一个帖子中下载内容,我的UI不会被阻止,一旦我的工作完成,我的UI会立即改变?
答案 0 :(得分:5)
您无法在后台线程上修改UIKit对象(例如UILabel
)。以上应该是:
-(void)changeText
{
dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(gqueue, ^(void){
//simulate a network traffic delay
[NSThread sleepForTimeInterval:5];
NSLog(@"start executing");
dispatch_async(dispatch_get_main_queue(), ^{
self.mylabel.text = @"Yeah! Text Changed"; });
NSLog(@"stop exec");
});
}
您也可以使用dispatch_sync
而不是display_async
等待主线程处理更改,但要注意死锁。