ios GCD之同步异步线程、线程组

作者: 只是个搬砖的 | 来源:发表于2017-09-21 18:40 被阅读0次
  1. 最常用GCD方法
dispatch_async(dispatch_get_global_queue(0,0),^{

NSLog(@"Start task 1");

[NSThread sleepForTimeInterval:3];

dispatch_async(dispatch_get_main_queue(),^{

//回到主线程刷新UI

NSLog(@"刷新UI");

});

});
  1. 系统分配子线程应用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

       NSLog(@"start task 1");

       [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 1");

    });

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

       NSLog(@"start task 2");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 2");

   });
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        NSLog(@"start task 3");

       [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 3");

   });
  1. 自行创建子线程
 //NULL == DISPATCH_QUEUE_SERIAL (同步线程)

    // DISPATCH_QUEUE_CONCURRENT  (异步线程)

   dispatch_queue_t queue = dispatch_queue_create("com.test.gcg.queue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{

        NSLog(@"start task 1");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 1");

    });

     dispatch_async(queue, ^{

        NSLog(@"start task 2");

        [NSThread sleepForTimeInterval:2];

       NSLog(@"end task 2");

   });

    dispatch_async(queue, ^{

       NSLog(@"start task 3");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 3");

  });
  1. 线程组
 dispatch_queue_t queue1 = dispatch_queue_create("com.test.gcg.group", DISPATCH_QUEUE_CONCURRENT);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue1, ^{

       NSLog(@"start task 1");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 1");

    });
    dispatch_group_async(group, queue1, ^{

        NSLog(@"start task 2");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 2");

    });
    dispatch_group_async(group, queue1, ^{

        NSLog(@"start task 3");

       [NSThread sleepForTimeInterval:2];

        NSLog(@"end task 3");

    });
  1. 线程组高级应用,很常见的情形:开辟两个网络请求,都结束之后,执行下一步操作。

(1)比较常规的做法是设置标示符,两线程结束后分别修改状态,两个标识符都改变后,执行下一步操作。

(2)运行线程组的:

dispatch_group_notify;

dispatch_group_enter(group);

dispatch_group_leave(group);

组合能完美解决此问题:

 dispatch_group_enter(group);

    [self sendRequest1:^{

        NSLog(@"request1 done");

        dispatch_group_leave(group);

    }];

    dispatch_group_enter(group);

    [self sendRequest1:^{

        NSLog(@"request2 done");

        dispatch_group_leave(group);

    }];

  dispatch_group_notify(group, queue1, ^{

   NSLog(@"All tasks over");

   dispatch_async(dispatch_get_main_queue(), ^{

   NSLog(@"回到主线程刷新UI");

});

});

-(void)sendRequest1:(void(^)())block{

dispatch_async(dispatch_get_global_queue(0,0),^{

NSLog(@"start task 1");

[NSThreadsleepForTimeInterval:2];

NSLog(@"end task 1");

dispatch_async(dispatch_get_main_queue(),^{

if(block){

block();

}
});

});

}
-(void)sendRequest2:(void(^)())block{

dispatch_async(dispatch_get_global_queue(0,0),^{

NSLog(@"start task 2");

[NSThreadsleepForTimeInterval:2];

NSLog(@"end task 2");

dispatch_async(dispatch_get_main_queue(),^{

if(block){

block();

}
});

});
}

相关文章

  • ios GCD之同步异步线程、线程组

    最常用GCD方法 系统分配子线程应用 自行创建子线程 线程组 线程组高级应用,很常见的情形:开辟两个网络请求,都结...

  • 多线程

    ios中为我们提供了GCD、NSOpration、NSThread 一、GCD多线程与锁GCD 同步异步、串行、并...

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • iOS面试之多线程模块

    多线程 多线程内容如下: GCD NSOperation NSThread 多线程与锁 1.GCD 同步/异步和串...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS gcd看我就够了

    gcd是iOS中多线程的一种技术,下面我们来看看gcd的用法 同步&异步 同步 同步执行:字面意思,同步执行就是执...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

网友评论

    本文标题:ios GCD之同步异步线程、线程组

    本文链接:https://www.haomeiwen.com/subject/sbstextx.html