zoukankan      html  css  js  c++  java
  • GCD(2)

    //

    //  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

     

  • 相关阅读:
    csharp: Cyotek.GhostScript.PdfConversion pdf convert image
    csharp: using Acrobat.dll pdf convert images in winform
    机器学习实战---K均值聚类算法
    机器学习实战---决策树CART回归树实现
    机器学习实战---决策树CART简介及分类树实现
    机器学习实战---线性回归(更好的使用正规方程求解)
    机器学习实战---逻辑回归梯度上升(更好的理解sigmoid函数的含义并改进)
    机器学习实战---朴素贝叶斯算法使用K折交叉验证
    机器学习实战---朴素贝叶斯算法
    机器学习实战---决策树ID3算法
  • 原文地址:https://www.cnblogs.com/wukun16/p/4884157.html
Copyright © 2011-2022 走看看