代码改变世界

GCD(2)

2015-10-16 05:08  真实16  阅读(482)  评论(0编辑  收藏  举报

//

//  ViewController.m

//  UI-NO.26-GCD

//

//  Created by Bruce on 15/8/27.

//  Copyright (c) 2015年 Bruce. All rights reserved.

//

/*

 Grand Central Dispatch (GCD)是苹果比较提倡的一个多核编程的解决方法

 GCD底层也是用线程来实现,指示苹果帮咱们封装了具体操作的方法,这样可以让程序员不用关注实现的细节,只需要专注功能的实现

 

 GCD参数 queue:队列 block:任务

 

 GCD 有两种执行任务的方式 1、同步dispatch_sync(避免在主队列中使用同步执行主线程任务 容易 死锁)  2、异步dispatch_async

 同步和异步的区别:

 同步:在当前线程中执行

 异步:在另一条线程中执行

 

 

 GCD执行多个任务的<队列>方式 也有两种:

 1、串行队列:让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

 2、并发队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效

 

 

 串行队列又分为两种:

 1、主队列       dispatch_get_main_queue() 主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行

 2、创建一个队列  dispatch_queue_create

 

 

 并发队列:GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建

 dispatch_get_global_queue 

 里面第一个参数是设置他的优先级

 #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 // 后台

 

 GCD延迟提交任务

 //    when:所指定的时间

 //    queue:指定的队列

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

 NSLog(@"延迟提交任务");

 });

 

 

 //    GCD 将任务分组

 //    有时候,我们可能执行一系列的任务。由于彼此之间的依赖关系。比如有3个任务:A、B、C;我们必须执行了任务A,才能执行任务B,最后执行任务C。这样的话,我们可以用GCD的分组机制来将多个任务来按照预定的顺序来执行

 

 //    创建一个组

 dispatch_group_t creatGroup = dispatch_group_create();

 //    创建一个队列

 dispatch_queue_t queue = dispatch_get_main_queue();

 

 dispatch_group_async(creatGroup, queue, ^{

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

 });

 

 dispatch_group_async(creatGroup, queue, ^{

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

 });

 

 dispatch_group_async(creatGroup, queue, ^{

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

 });

 

 dispatch_group_notify(creatGroup, queue, ^{

 NSLog(@"成功");

 });

 

 */

#import "ViewController.h"

 

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>

{

    UITableView *myTableView;

    UIImage *showImage;

    NSArray *urlList;

    NSMutableDictionary *imageDic;

}

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    imageDic = [NSMutableDictionary dictionary];

    

//    串行队列:

//    得到主队列

    dispatch_queue_t mainQueue = dispatch_get_main_queue();

//    创建一个队列

    dispatch_queue_t createQueue = dispatch_queue_create("create", NULL);

 

    

//    NSLog(@"....");

//    同步用于串行队列:主线程在等待着主队列调度同步任务,而主队列发现主线程上还有任务未执行完,就不会让同步任务添加到主线程上,由此就造成了互相等待,就会造成死锁

//    dispatch_sync(mainQueue, ^{

//        NSLog(@"1111");

//    });

//    viewDidLoad 在主线程中,执行到sync 时 向 dispatch_get_main_queue()插入 同步 操作

//    sync 会等到 后面block 执行完成才返回, sync 又再 dispatch_get_main_queue() 队列中,

//    它是串行队列,sync 是后加入的,前一个是主线程,

//    所以 sync 想执行 block 必须等待主线程执行完成,主线程等待 sync 返回,去执行后续内容。

//造成死锁,sync 等待mainThread 执行完成, mianThread 等待sync 函数返回。

//  异步

//    dispatch_async(mainQueue, ^{

//        NSLog(@"1111");

//    });

//    dispatch_sync(createQueue, ^{

//        NSLog(@"1111");

//    });

//    dispatch_sync(createQueue, ^{

//        NSLog(@"2222");

//    });

//    dispatch_sync(createQueue, ^{

//        NSLog(@"3333");

//    });

    

//    dispatch_async(createQueue, ^{

//        NSLog(@"1111");

//    });

//    dispatch_async(createQueue, ^{

//        NSLog(@"2222");

//    });

//    dispatch_async(createQueue, ^{

//        NSLog(@"3333");

//    });

    

    

    

//    并发队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

    dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

//    并发队列 只在异步的情况下有效

//    dispatch_async(queue, ^{

//        NSLog(@"111");

//    });

//    dispatch_async(queue1, ^{

//        NSLog(@"1111");

//    });

//    dispatch_async(queue2, ^{

//        NSLog(@"11111");

//    });

    

    

    dispatch_group_t group = dispatch_group_create();

    dispatch_sync(queue, ^{

        NSLog(@"1...");

    });

    dispatch_sync(queue, ^{

        NSLog(@"2...");

    });

    dispatch_sync(queue, ^{

        NSLog(@"3...");

    });

 

    dispatch_group_notify(group, queue, ^{

        NSLog(@"ok...");

    });

    

    dispatch_group_t group1 = dispatch_group_create();

    dispatch_sync(queue1, ^{

        NSLog(@"1...1");

    });

    dispatch_sync(queue1, ^{

        NSLog(@"2...1");

    });

    dispatch_sync(queue1, ^{

        NSLog(@"3...1");

    });

    

    dispatch_group_notify(group1, queue1, ^{

        NSLog(@"ok...1");

    });

    

    

    

    urlList = @[@"http://image.tianjimedia.com/uploadImages/2012/273/M6J97CZGYA4Z_NatGeo01_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/J3ME8ZNAG315_NatGeo02_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/EL9230AP5196_NatGeo03_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/SYJ43SG47PC8_NatGeo04_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/605X52620G0M_NatGeo05_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/7H5RQ1ELP8MZ_NatGeo06_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/Z2W429E0203R_NatGeo07_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/BG011W9LWL77_NatGeo08_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/936FM8NN22J2_NatGeo09_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/H79633PPEFZW_NatGeo10_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/54Z01YZ78050_NatGeo11_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/61V3658UA4IY_NatGeo12_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/H3HL7YILNGKB_NatGeo13_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/1V6797311ZA5_NatGeo14_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/93L81IKN156R_NatGeo15_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/V93E1EGU2G0Z_NatGeo16_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/QC205CD96IWZ_NatGeo17_250.jpg"];

    

    myTableView = [[UITableView alloc]initWithFrame:self.view.frame];

    myTableView.delegate = self;

    myTableView.dataSource = self;

    [self.view addSubview:myTableView];

 

}

 

 

 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(!cell){

        cell  = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        

    }

    __block UIImage *images = [imageDic objectForKey:@(indexPath.row)];

    if (!images) {

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

            NSURL *url = [NSURL URLWithString:urlList[indexPath.row]];

            NSURLRequest * request = [NSURLRequest requestWithURL:url];

            NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

            if (data) {

                images = [UIImage imageWithData:data];

                [imageDic setObject:images forKey:@(indexPath.row)];

            }

            

            //下载完成后转到主线程更新表格cell

            dispatch_async(dispatch_get_main_queue(), ^{

                [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

            });

        });

 

    }

    

    cell.imageView.image = images;

    return cell;

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return urlList.count;

}

 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    return 100;

}

 

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end