GCD 的使用

//
//  ZYGCDViewController.h
//  Thread
//
//  Created by wanglixing on 14/11/4.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ZYGCDViewController : UIViewController

@end
//
//  ZYGCDViewController.m
//  Thread
//
//  Created by wanglixing on 14/11/4.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import "ZYGCDViewController.h"

@interface ZYGCDViewController ()

@end

@implementation ZYGCDViewController

- (void)viewDidLoad {
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //GCD 在实现多线程的时候有两个优点:
    //1.可以充分利用多核处理器的性能。
    //2.使用起来简单方便,不需要管理线程的生命周期,可以使我们更关注于需要在线程中执行的任务。

    //GCD 使用队列(queue)管理线程。队列一般分两种:
    //1.运行在主线程的队列,mainQueue。一次只能执行一个任务,遵循先进先出的原则(FIFO),串行队列。
    //获得 mainQueue 队列。
    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    //2.运行在分线程的队列,四个优先级不同的 globalQueue。并行队列,同时可以执行多个任务。globalQueue 管理了一组的分线程,实际运行的时候使用哪一个分线程,我们是不能控制的。

//#define DISPATCH_QUEUE_PRIORITY_HIGH 2
//#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
//#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
//#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

    //第一个参数是优先级,第二个参数无意义。
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //只需要把任务提交到队列中,任务就会在对应的线程中执行了。
    //同步,阻塞线程,等待任务执行完毕才继续执行后续代码。
    //异步,同时执行。
    //同步提交,如果在主线程使用,会导致线程死锁。
//    dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>);

//    NSLog(@"=========");
//
//     dispatch_sync(mainQueue, ^{
//         NSLog(@"----------");
//     });
//
//    NSLog(@"+++++++++++");

    //异步提交,一般只使用这种方法。
    dispatch_async(mainQueue, ^{
        //block 的内容在主线程执行。

        if ([NSThread isMainThread]) {
            NSLog(@"主线程");
        }else {
            NSLog(@"分线程");
        }
    });

    dispatch_async(globalQueue, ^{
        //block 的内容在分线程执行。

        if ([NSThread isMainThread]) {
            NSLog(@"=====主线程");
        }else {
            NSLog(@"=====分线程");
        }
    });

    //串行队列,先进先出,依次执行。
//    dispatch_async(mainQueue, ^{
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//    });
//
//    dispatch_async(mainQueue, ^{
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//    });
//
//    dispatch_async(mainQueue, ^{
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//    });
//
//    dispatch_async(mainQueue, ^{
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//    });

    //并行队列,多个任务同时执行。
//    dispatch_async(globalQueue, ^{
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//        NSLog(@"11111111111");
//    });
//
//    dispatch_async(globalQueue, ^{
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//        NSLog(@"22222222222");
//    });
//
//    dispatch_async(globalQueue, ^{
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//        NSLog(@"33333333333");
//    });
//
//    dispatch_async(globalQueue, ^{
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//        NSLog(@"44444444444");
//    });

    //可以自定义队列,但是一般用不上,系统提供给我们的两个已经够用了。
//    dispatch_queue_create("com.www.zhiyou", nil);

    //系统的某些方法也会用到 mainQueue 和 globalQueue。

    //通常这样使用 GCD。
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //去分线程执行代码。
        dispatch_async(dispatch_get_main_queue(), ^{
           //切回主线程,刷新 UI。
        });
    });

    //下载图片。
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       //下载图片。dataWithContentsOfURL 是同步请求。
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://xxx/1.jpg"]];

        UIImage* image = [UIImage imageWithData:data];

        //切换回主线程。
        dispatch_async(dispatch_get_main_queue(), ^{
            UIImageView* imageView = [[UIImageView alloc] initWithImage:image];

            [self.view addSubview:imageView];

            [imageView release];
        });
    });

    //等待某些任务执行完毕后,再去执行另外一个任务。
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        下载图片1。
        NSLog(@"11111111111");
        NSLog(@"11111111111");
        NSLog(@"11111111111");
        NSLog(@"11111111111");
        NSLog(@"11111111111");
    });

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //下载图片2。
        NSLog(@"22222222222");
        NSLog(@"22222222222");
        NSLog(@"22222222222");
        NSLog(@"22222222222");
        NSLog(@"22222222222");
    });

    //等待 group 中的全部任务执行完毕,才会执行这里的任务。
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"33333333333");
        NSLog(@"33333333333");
        NSLog(@"33333333333");
        NSLog(@"33333333333");
        NSLog(@"33333333333");
    });
}

@end
时间: 2024-08-04 22:14:01

GCD 的使用的相关文章

dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)

1094: 等差区间 Time Limit:5000/3000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Total Submissions:655   Accepted:54 [Submit][Status][Discuss] Description 已知一个长度为 n 的数组 a[1],a[2],-,a[n],我们进行 q 次询问,每次询问区间 a[l],a[l+1],-,a[r?1],a[r] ,数字从小到大

iOS GCD中级篇 - dispatch_group的理解及使用

前文我们讲了GCD基础篇,以及同步.异步,并发.并行几个概率的理解. 参考链接: iOS GCD基础篇 - 同步.异步,并发.并行的理解 现在讲一下dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2.dispatch_group_async 把一个任务异步提交到任务组里 3.dispatch_

转 GCD

GCD 深入理解:第一部分 本文翻译自 http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 原作者:Derek Selander 译者:@nixzhu 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD . 在这两

GCD多线程死锁总结

// //  ViewController.m //  多线程 // // #import "ViewController.h" @interface ViewController () @end @implementation ViewController /* >1 队列和线程的区别: 队列:是管理线程的,相当于线程池,能管理线程什么时候执行. 队列分为串行队列和并行队列 串行队列:队列中的线程按顺序执行(不会同时执行) 并行队列:队列中的线程会并发执行,可能会有一个疑问,队

GCD 常用操作

GCD多线程操作 1)用得最多的操作 //获取全局队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //异步执行 dispatch_async(queue, ^{ //下载图片 dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程更新UI }); }); ? 2)延时执行 1-调用NSObject方法 [Self

GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

iOS开发——多线程OC篇&amp;GCD实用总结

GCD实用总结 图片下载 注:iOS开发中常见GCD的实用也就这些了, 先来看看之前我们经常使用的方式: 1 static NSOperationQueue * queue; 2 3 - (IBAction)someClick:(id)sender { 4 self.indicator.hidden = NO; 5 [self.indicator startAnimating]; 6 queue = [[NSOperationQueue alloc] init]; 7 NSInvocationO

猫猫学iOS(五十二)多线程网络之GCD下单例设计模式

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 单例模式 1:单例模式的作用 可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问 从而方便地控制了实例个数,并节约系统资源 单例模式的使用场合 在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次) 简单来说,就是我弄了一个工具类,他就有一份,比如我设计了一个音乐播放器NYPlayer,这个播放器类我

iOS 开发之多线程之GCD

1.GCD(Grand Centrol Dispath) 并行:宏观以及微观都是两个人再拿着两把铁锹在挖坑,一小时挖两个大坑 并发:宏观上是感觉他们都在挖坑,微观是他们是在使用一把铁锹挖坑,一小时后他们挖了两个小坑. 总结:就单个cpu来说,大部分进程是并发进行的,就是一把铁锹,你一下我一下,只是间隔时间较短,用户感觉不到而已. 应用: GCD包括: (1)实际使用中 //dispatch_get_global_queue(0, 0)第一个0是优先级,第二个保留字段 dispatch_async

hdu 4497 GCD and LCM

GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 1092    Accepted Submission(s): 512 Problem Description Given two positive integers G and L, could you tell me how many solutions of (