首先创建一个标签,通过标签值的变化来看这个线程的特性
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";
});
}
}
});