zoukankan      html  css  js  c++  java
  • GCD多线程学习

    1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。

         2)并行队列global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。

         3)串行队列serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。

         

         当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。

         

         serial queues通过dispatch_queue_create创建,可以使用函数dispatch_retaindispatch_release去增加或者减少引用计数。

         for (int i = 0 ; i < 10; i++) {

         //使用并列线程去下载图片,同时调用主线程去刷新界面,因为ui属于主线程

            dispatch_async(dispatch_get_global_queue(0, 0), ^{

            // 处理耗时操作的代码块...

            UIImage *img = [self getImgeWith:[urlArr objectForIndex:i]];

            

         //通知主线程刷新

         dispatch_async(dispatch_get_main_queue(), ^{

            //回调或者说是通知主线程刷新,

            [myImgV[i] setImage:img];

         });

         

         

         下载这些图片,然后对这些图片进行处理,就需要等待全部下载完成之后再进行处理,所以需要等待其全部下载完成。使用函数dispatch_group_async来将block提交至一个dispatch queue,同时将它们添加至一个组。所以我们现在可以重新代码:

         下边是一个例子

         dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

            dispatch_group_t group = dispatch_group_create();

         for(id obj in array)

            dispatch_group_async(group, queue, ^{

            [self doSomethingIntensiveWith:obj];

            });

            dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

            dispatch_release(group);

            [self doSomethingWith:array];

         });

         dispatch_queue_t 可以作为线程的对象

         如果这些工作可以异步执行,那么我们可以更风骚一点,将函数-doSomethingWith:放在后台执行。我们使用dispatch_group_async函数建立一个block在组完成后执行:

         

         dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

            dispatch_group_t group = dispatch_group_create();

        for(id obj in array)

            dispatch_group_async(group, queue, ^{

            [self doSomethingIntensiveWith:obj];

            });

         dispatch_group_notify(group, queue, ^{

            [self doSomethingWith:array];

            });

         dispatch_release(group);

         

  • 相关阅读:
    Memoization-329. Longest Increasing Path in a Matrix
    Map-560. Subarray Sum Equals K
    Geometry-587. Erect the Fence
    Reservoir Sampling-382. Linked List Random Node
    Brainteaser-292. Nim Game
    Minimax-486. Predict the Winner
    Topological Sor-207. Course Schedule
    web前端开发规范手册
    css初始化
    asp.net LINQ实现数据分页
  • 原文地址:https://www.cnblogs.com/AbelChen1991/p/3671742.html
Copyright © 2011-2022 走看看