码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发多线程之GCD

时间:2015-10-05 21:56:49      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

- (void)viewDidLoad {

    [super viewDidLoad];

    /*GCD:Grand Central Dispatch 牛逼的中枢调度器,自动管理线程的生命周期(创建 调度 销毁)。将任务存放到队列中,GCD会自动将队列中的任务取出,先进先出,放到线程中执行。

     同步执行任务:在当前线程中执行 dispatch_sync(dispatch_queue_t queue,dispatch_block_t block)

     异步执行任务:在其他线程执行 dispatch_async(...)

     队列dispatch_queue_t:

          并发队列(开启多个线程执行多个任务,只在异步执行有效):默认提供,不需要手动创建 全局并发队列 dispatch_get_global_queue(dispatch_queue_priority_t priority,0);

          串行队列:创建 dispatch_queue_creat(‘名称’,属性NULL)

                   主队列(主线程相关联) dispatch_get_main_queue()

     开不开启新线程还得看执行任务的方式

    */

  

    /*

     主队列是与主线程相关的串行队列,只会在主线程执行,与执行方式无关,一般使用异步方式。

     子线程拿数据,主线程展示。转到主线程的方式:1.直接转2.放到主队列里

     */

    

    /*

     延迟执行:1.调用NSObject [self performSelector: withObject: afterDelay:2.0];方法在哪个线程调用,那么延迟执行的方法就在那个线程执行

            2.使用GCD dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block);什么时间,执行这个队列的这个任务。(主队列就在主线程,并发队列就新建线程)

              例子:dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), queue, ^{

          */

    /*

     实现一次性代码:dispatch_once函数

     例子:static dispatch_once_t onceToken;

          dispatch_once(&onceToken, ^{

          // 只执行1次的代码(这里面默认是线程安全的)

          });

          整个程序运行过程中,只会执行一次。

     */

    /*

     队列组:可以让两个任务同时进行,切当两个任务都完成时,再做其他事。异步做几个耗时的事,等完事要回到主线程时用队列组。

     创建一个组 dispatch_group_t group = dispatch_group_create();

     开启一个任务 dispatch_group_async(group,全局并发队列,^{});

     开启其他任务 dispatch_group_async(group,全局并发队列,^{})

     执行所有任务

     完事后回到主线程 dispatch_group_notify(group,主线程,^{});

     */

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{

        NSString *imageStrring = [NSString stringWithFormat:@"http://i6.topit.me/6/5d/45/1131907198420455d6o.jpg"];

        NSURL *imageUrl = [NSURL URLWithString:imageStrring];

        NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];

        self.image = [UIImage imageWithData:imageData];

        dispatch_async(dispatch_get_main_queue(), ^{

            self.imageView.image = self.image;

        });

        

    });

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

        button.frame = CGRectMake(40, 40, 100, 100);

        [button setTitle:@"Click" forState:UIControlStateNormal];

    [button setBackgroundColor:[UIColor redColor]];

    [button addTarget:self action:@selector(clicked) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:button];

    

}

-(void)clicked

{

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(40, 140, 300, 300)];

    imageView.image = self.image;

    [self.view addSubview:imageView];

}

iOS开发多线程之GCD

标签:

原文地址:http://www.cnblogs.com/haugezi/p/4856331.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!