GCD线程方式

  GCD的线程方式是以C语言为基础的多线程技术,整体上分为串行队列和并行队列两种实现方式。html

  GCD串行队列:服务器

    

#param mark -TWThread.gcd.seral是新建立的队列的名字,主要做用体如今断点调试阶段,能够根据名字判断线程的队列
//DISPATCH_QUEUE_SERIAL,标志着这个队列是串行队列,DISPATCH_QUEUE_CONCURRENT,表示为并行队列
-(void)gcdSeral
{
    //建立一个串行队列
    dispatch_queue_t q = dispatch_queue_create("TWThread.gcd.seral", DISPATCH_QUEUE_SERIAL);
    //同步任务顺序执行(串行队列中的同步任务,也只能是顺序执行的,没有意义)
//    dispatch_sync(q, ^{
//        NSLog(@"%@",[NSThread currentThread]);
//    });
    //串行队列中的异步任务会新建一个线程(串行队列中的异步任务是在IOS开发中最经常使用的方式)
    for (int i = 0; i < 10; i++) {
        dispatch_async(q, ^{
            NSLog(@"%@",[NSThread currentThread]);//打印当前线程
        });
    }
}

  GCD并行队列:网络

    

#pragma mark -并行队列
-(void)gcdConcurrent
{
    //特色:没有队形,执行顺序程序猿不能控制
    //建立一个并行队列
    dispatch_queue_t q = dispatch_queue_create("TWThread.gcd.concurrent", DISPATCH_QUEUE_CONCURRENT);
    //并行队列中执行同步任务也只能在主线程中进行
    //并行队列中执行异步任务会建立多个线程(在多线程中不容易进行优先级的控制,主要缘由是使用C语言来实现优先级的处理比较复杂)
    for (int i = 0; i<10; i++) {
        dispatch_async(q, ^{
            NSLog(@"%@",[NSThread currentThread]);
        });
    } 
}

   GCD全局队列:多线程

    

#pragma mark - 全局队列,苹果为了方便开发者进行多线程开发而保留的全局的队列
-(void)gcdGlobalQueue
{
    //全局队列无需建立直接get
   
    
    dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //同步任务顺序执行
//    dispatch_sync(q, ^{
//        NSLog(@"%@",[NSThread currentThread]);
//    });
    //异步任务会建立多个线程
    for (int i = 0; i < 10; i++) {
        dispatch_async(q, ^{
            NSLog(@"%@",[NSThread currentThread]);
        });
    }
}

    GCD总结异步

   1>disptach_sync       没有建立线程的欲望,就在当前线程执行async

      最主要的目的,阻塞并行队列任务的执行,只有当前的同步任务执行完毕后,后续的任务才可以执行spa

      应用场景:用户登陆!线程

   2>dispatch_async     有建立线程的欲望,可是建立多少条线程,取决与队列的类型调试

   GCD的队列htm

   1>串行队列     相似于跑步,只有一条跑道,最多可以有两条

      若是存在异步任务,就会在新线程中执行异步任务,而同步任务依旧在当前线程中执行

   2>并行队列      相似与赛跑,具体跑道的数量,由系统决定

  一个实际问题的解决

  用户登陆操做,登陆的过程当中能够选择取消登陆操做,可是在登陆完成以前不能进行其余的操做。

  解决方式是,进行任务嵌套

  

- (void)demo
{
    dispatch_queue_t q = dispatch_queue_create("demo", DISPATCH_QUEUE_CONCURRENT);
    
    // 在新线程中工做,将这个登陆的过程放在一个异步队列中
    dispatch_async(q, ^{
        // 2
        NSLog(@"%@", [NSThread currentThread]);
        
        __block BOOL userLogon = NO;
        
        // 用户登陆,用户输入用户名,密码以后,提交到服务器确认身份
        // 用来阻塞必需要按照顺序执行的任务,将登陆的过程放在同步任务中。
        dispatch_sync(q, ^{
            // 2
            NSLog(@"用户网络登录 %@", [NSThread currentThread]);
            
            [NSThread sleepForTimeInterval:3.0f];
            
            userLogon = NO;
        });
        
        // 身份确认以前,不能作其余事情
        dispatch_async(q, ^{
            // 多是3,也多是2
            // 3.0(对的) / 立马执行(不对的)
            NSLog(@"后续处理 %@", [NSThread currentThread]);
            
            if (userLogon) {
                NSLog(@"welcome");
            } else {
                NSLog(@"why");
            }
        });
        
        // 队列是先进先出FIFO的,队列中的任务都是串着的
    });
}
相关文章
相关标签/搜索