iOS 多线程初学习之dispatch_async(dispatch_get_main_queue(), ^{})

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建一个标签,通过标签值的变化来看这个线程的特性

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;

           }

            

        }

        

    });


此时在界面上显示的值也是name ,但是此段代码的作用是和上一段代码结合对比充分的说明一个结果,那就是在这个线程的while事件什么时候结束,是么时候才会更新UI


再看最后一段代码。这段代码是将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";

 

                });

                

                

            }

            

            

        }

       

    });

    

这个时候会发现label 的内容会及时发生改变为 name;
以上代码说明一个问题就是在主线程中一般只是更新UI显示,其他的一些数据处理一般不在这里进行,特别是当需要在线程中处理一些while事件时,这个时候多线程处理要特别注意,不能乱用。



 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值