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

  • 相关阅读:
    IE11和传统asp.net的兼容问题
    时区和夏令时
    GTA项目 三, 使用 bootstrap table展示界面,使得data和UI分离
    GTA项目 二, JSON接口开放跨域访问
    GTA项目 一, 包装外部WebService
    DNS域名解析
    CRM 迁移服务器备忘
    CentOS6.5 安装HAProxy 1.5.20
    Custom IFormatProvider
    数据分区考虑
  • 原文地址:https://www.cnblogs.com/ygm900/p/3696488.html
Copyright © 2011-2022 走看看