美文网首页
iOS的多线程问题三丶GCD总结

iOS的多线程问题三丶GCD总结

作者: Scheng_ | 来源:发表于2017-04-21 09:32 被阅读0次

总的来说GCD总共有以下四种手动模式和两个官方模式
1.并行队列同步任务(不开线程)
2.并行队列异步任务(开线程)
3.串行队列同步任务(不开线程)
4.串行队列异步任务(不开线程)
a.全局队列同步任务(不开线程)
b.全局队列异步任务(开线程)
*注:实际开发中常用的只有两种(全局队列异步任务和串行队列异步任务、其他的几乎无意义)
1.并行队列同步任务(不开线程)
- (void)conCurrentQueueSync {
// 并行队列 DISPATCH_QUEUE_CONCURRENT
// 空 DISPATCH_QUEUE_SERIAL 并行队列开了十个同步任务(一个线程)
dispatch_queue_t queue = dispatch_queue_create("conCurrent",DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i< 10; i++) {
dispatch_sync(queue, ^{
NSLog(@"testConcurrent %d %@",i,[NSThread currentThread]);
});
} }
2.同步队列异步任务(开线程)
- (void)conCurrentQueueASync {
// 并行队列 DISPATCH_QUEUE_CONCURRENT
// DISPATCH_QUEUE_SERIAL 同步队列开了十个异步任务(十个线程)
dispatch_queue_t queue = dispatch_queue_create("conCurrent",DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i< 10; i++) {
dispatch_async(queue, ^{
NSLog(@"testConcurrent %d %@",i,[NSThread currentThread]);
});
} }
3.串行队列同步任务(不开线程)
- (void)serialQueueSync {
//
// #define DISPATCH_QUEUE_SERIAL NULL 串行队列同步任务(一个线程顺序执行)
dispatch_queue_t queue = dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
for (int i = 0; i< 10; i++) {
dispatch_sync(queue, ^{
NSLog(@"testSerial %d %@",i,[NSThread currentThread]);
});
} }
4.串行队列异步任务(不开线程)
- (void)serialQueueASync {
// #define DISPATCH_QUEUE_SERIAL NULL 串行队列异步任务(一个线程)
dispatch_queue_t queue = dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
for (int i = 0; i< 10; i++) {
dispatch_async(queue, ^{
NSLog(@"testSerial %d %@",i,[NSThread currentThread]);
});
} }

a.全局队列同步任务(不开线程)
- (void)globalQueueSync {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i = 0; i< 10; i++) {
dispatch_sync(queue, ^{
NSLog(@"global %d %@",i,[NSThread currentThread]);
});
} }
b.全局队列异步任务(开线程)
- (void)globalQueueASync {
// 全局队列异步任务(开线程)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i = 0; i< 10; i++) {
dispatch_async(queue, ^{
NSLog(@"global %d %@",i,[NSThread currentThread]);
});
} }
e.g:线程间通信 ---- 使用GCD下载图片
- (void)gcdImageLoad {//开异步任务
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 1 找图片的下载地址
NSString *imageUrlStr1 = @"http://img2.zol.com.cn/product/95/20/ceSFw3e3TqLNM.jpg";
// NSString *imageUrlStr3 = @"http://192.168.1.20/787787.png";

    NSURL *url = [NSURL URLWithString:imageUrlStr1];
    // 2 苹果的url方法都是同步的  会卡界面
    NSData *data = [NSData dataWithContentsOfURL:url]; // 默认的timeOut是60秒
    // 3 回主队列更新UI
    dispatch_async(dispatch_get_main_queue(), ^{
        self.iconImageView.image = [UIImage imageWithData:data];
        //执行顺序是132
    });
    
});   }


- (IBAction)testGCDClick:(id)sender {
[self gcdImageLoad];    }
    • (IBAction)gcdOperateClick:(id)sender {
      dispatch_async(
      dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      // 执行耗时的异步操作...
      // 图片的下载
      NSLog(@"1 imageDownedLoad %@",[NSThread currentThread]);
      dispatch_async(dispatch_get_main_queue(), ^{
      // 回到主线程,执行UI刷新操作
      // 刷新图片信息 执行异步顺序132如果变成sync同步执行顺序123
      NSLog(@"3 updateUI");
      });
      // NSLog(@"2 dfadfadfadf");
      })}

相关文章

  • iOS多线程:『GCD』详尽总结

    iOS多线程:『GCD』详尽总结 iOS多线程:『GCD』详尽总结

  • iOS的多线程问题三丶GCD总结

    总的来说GCD总共有以下四种手动模式和两个官方模式1.并行队列同步任务(不开线程)2.并行队列异步任务(开线程)3...

  • GCD

    转载 iOS多线程:『GCD』详尽总结

  • 线程

    iOS 多线程:『GCD』详尽总结 NSThread详解 IOS 多线程编程 『NSOperation、NSOpe...

  • iOS 多线程

    参考链接 iOS多线程iOS 多线程:『GCD』详尽总结iOS简单优雅的实现复杂情况下的串行需求(各种锁、GCD ...

  • iOS 多线程学习-思维导图版本

    GCD、NSOperation、NSThread 1.GCD 参考地址:iOS 多线程:『GCD』详尽总结 重要概...

  • (转)iOS多线程:『GCD』详尽总结

    本文转载自:行走的少年郎的简书:iOS多线程:『GCD』详尽总结 本文用来介绍 iOS 多线程中 GCD 的相关知...

  • 高级iOS面试题全纪录

    iOS基础: 多线程使用,gcd跟operation区别,怎么取消正在执行的gcd任务 GCD 系列知识总结 NS...

  • iOS 多线程

    参考资料:iOS多线程iOS GCD 多线程问题在iOS中目前有4套多线程方案,他们分别是: PthreadsNS...

  • iOS学习笔记11-多线程入门

    一、iOS多线程 iOS多线程开发有三种方式: NSThread NSOperation GCD iOS在每个进程...

网友评论

      本文标题:iOS的多线程问题三丶GCD总结

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