简单学习GCD随记

   GCD (Grand Central Dispatch),在某些程序员中俗称之为“伟大的调度中心“。GCD 是苹果封装好的一个方法,它的底层仍然是用多线程实现的,不过便于程序猿的使用不必关注实现的细节。GCD存在于libdispatch.dylib 这个库中,整个库工程默认动态加载。

   GCD 的优势:

    1.CGD会自动利用更多的CPU内核(比如双核、四核)

     2.GCD会自动管理线程的生命周期,无需程序猿手动操作(创建线程、调度任务、销毁线程)

     3.便于程序猿的使用,只需要告知GCD需要执行的任务,不需要编写任何线程关联的代码 

    GCD 的使用:

     1.队列,用来存放要执行的任务

     2.任务,执行的操作


     GCD中的FIFO(First In , First Out) 队列称为:dispatch queue ,它可以保证先进来的任务先得到执行,dispatch queue 有三种:

     1.Serial dispatch queue (串行队列),同时只执行一个任务(一个任务执行完毕以后,再执行下一个任务),虽然各自是同步执行的,但每个Serial dispatch queue 之间是并发执行的。

      2.Concurren dispatch queue(并发队列),即可以并发的执行多个任务(可以让多个任务同时执行,自动开启多个线程同时执行任务,并发功能只有在异步函数(dispatch_async) 下有效),但执行完成的顺序是随机的。

      3.Main dispatch queue(主队列),是全局可用的serial queue (直接在主线程中串行执行任务),它是应用于主线程上的。

 

//

//  ViewController.m

//  GCD多线程的使用

//

//  Created by webapps on 17/1/16.

//  Copyright © 2017 webapps. All rights reserved.

//



/*GCD ---> Grand Central Dispatch 俗称伟大的调度中心*/



#import "ViewController.h"


@interface ViewController ()

{

    UIImageView *imageView;

}

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    

    imageView = [[UIImageView alloc]init];

    imageView.frame = CGRectMake(50, 100, 100, 100);

    imageView.contentMode = UIViewContentModeScaleAspectFit;

    [self.view addSubview:imageView];

   

    // 获取主队列

    dispatch_queue_t MainQueue = dispatch_get_main_queue();

    

    dispatch_async(MainQueue, ^{

        NSLog(@"使用异步函数执行队列中任务1---%@",[NSThread currentThread]);

    });

    

    dispatch_async(MainQueue, ^{

        NSLog(@"使用异步函数执行队列中任务2---%@",[NSThread currentThread]);

    });

    

    // 获取一个全局队列

    

    /*

     #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_async(GlobalQueue, ^{

        // 打印一下当前的线程

        NSLog(@"当前的进程是哪个 %@",[NSThread currentThread]);

        


        /*wsqToop: GCD方式 */

        NSURL *imageUrl = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1484287073&di=df0b9e256cf9d6608728d83842f49817&src=http://d.hiphotos.baidu.com/image/pic/item/5882b2b7d0a20cf482c772bf73094b36acaf997f.jpg"];

        NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];

        UIImage *image = [UIImage imageWithData:imageData];

        

        // 回到主线程更新图片

        dispatch_async(MainQueue, ^{

            

            imageView.image = image;

            

        });

        

        // 另一种回到主线程方式刷新UI

        [self downImage];

        

        

    });

    

    

     NSLog(@"xxxxxxxx %@",[NSThread currentThread]);

    

}



/*wsqToop: GCDNSThread*/

- (void)downImage{

    

    NSURL *imageUrl = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1484287073&di=df0b9e256cf9d6608728d83842f49817&src=http://d.hiphotos.baidu.com/image/pic/item/5882b2b7d0a20cf482c772bf73094b36acaf997f.jpg"];

    NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];

    UIImage *image = [UIImage imageWithData:imageData];

    

    [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];

   

}


- (void)setImage:(UIImage *)image{

 

    imageView.image = image;

}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



@end




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值