zoukankan      html  css  js  c++  java
  • 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), ^{   //    });

  • 相关阅读:
    MySQL 存储过程和函数02
    MySQL 视图 存储过程(未完)
    MySQL 简单索引
    Nginx 设置前后端跨域
    Pipeline流水线 自动脚本
    luogu 2024 食物链
    spoj Corporative Network
    luogu2787 语文1(chin1)- 理理思维
    HDU6579 Operation
    luogu3857 彩灯
  • 原文地址:https://www.cnblogs.com/ygm900/p/3696488.html
Copyright © 2011-2022 走看看