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), ^{   //    });

 

 

 

 

posted @ 2014-04-28 15:36  ygm900  阅读(400)  评论(0编辑  收藏  举报