首先创建一个标签,通过标签值的变化来看这个线程的特性
UILabel *bel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 100, 50)];
bel.backgroundColor = [UIColor redColor];
bel.text = @"TSET";
[self.view addSubview:bel];
第一段代码
dispatch_async(dispatch_get_main_queue(), ^{
NSInteger i=1;
while (i) {
usleep(30*1000);
NSLog(@"%ld",i);
i++;
if (i==100)
{
bel.text = @"name";
}
}
});
此时在界面上的label 的值会发生改变吗?
答案是不会改变的,显示的依旧是 TEST;
上第二段代码
dispatch_async(dispatch_get_main_queue(), ^{
NSInteger i=1;
while (i) {
usleep(30*1000);
NSLog(@"%ld",i);
i++;
if (i==100)
{
bel.text = @"name";
i=0;
}
}
});
此时在界面上显示的就是name
再上一段代码
dispatch_async(dispatch_get_main_queue(), ^{
NSInteger i=1;
while (i) {
usleep(30*1000);
NSLog(@"%ld",i);
i++;
if (i==100)
{
bel.text = @"name";
}
if(i==150)
{
i = 0;
}
}
});
再看最后一段代码。这段代码是将while事件写在子线程中,将更新UI事件回到主线程中执行
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSInteger i=1;
while (i) {
usleep(30*1000);
i ++;
if (i == 100) {
dispatch_async(dispatch_get_main_queue(), ^{
bel.text = @"name";
});
}
}
});

本文通过示例代码探讨了iOS应用中多线程与主线程的交互,特别是在UI更新上的差异。在不同的情景下,使用`dispatch_async`将任务放在主线程或全局队列中,观察UILabel的文字变化,揭示了UI更新必须在主线程进行的原理。
633

被折叠的 条评论
为什么被折叠?



