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

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

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事件时,这个时候多线程处理要特别注意,不能乱用。



 





你可能感兴趣的:(iOS,多线程,iOS开发)