GCD实现多线程 实践

 GCD中弹窗的正确写法

- (void)viewDidLoad

{

    //……

    if (![self isStartLoading]) [self startLoading:nil];   //loading界面放在这可以正常显示,速度比较快

        

    

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        

        if ([self getNetConnectState])

        {

           

        }

        else                           

        {

            /*alert 直接放在这里可以显示,但是特别耗时间,而且这段时间整个界面是卡死的,建议将这个写在dispatch_get_main_queue()中,如下 */

            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"没有连接到网络,请检查网络设置。" delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil];

            [alert show];

            [alert release];

            

            /*   弹窗的正确写法    */

             dispatch_async(dispatch_get_main_queue(), ^{

                

                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"没有连接到网络,请检查网络设置。" delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil];

                [alert show];

                [alert release];

                

                if ([self isStartLoading]) [self stopLoading];

            });

        }

     });

}

 

使用GCD请求网络数据时,一定要考虑,网络数据返回时,viewController已经销毁的情况!

 

当程序执行到此处时,应用程序就获取了程序的主线程,此处绝对不要写影响速度的代码。否则整个界面将被卡死。

 dispatch_async(dispatch_get_main_queue(), ^{  //……   });

同样地,在 下面地代码中,绝对不要写界面操作的代码,否则不仅执行不了,即使执行了,速度也奇慢。同时也容易引起内存访问crash,因为这里是废时操作,用户有可能会在此处点返回按钮。而且此时主线程不在程序手中。用户可以做任何操作。

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{   //    });

 

 

 

 

GCD实现多线程 实践

你可能感兴趣的:(多线程)