美文网首页
Block简介和在GCD中的举例

Block简介和在GCD中的举例

作者: David_Cap | 来源:发表于2015-07-30 11:39 被阅读449次

Block简介

Block的使用

1 如何用block实现 hello world!!!

   void (^aBlock)(void) = ^(void){ NSLog(@"Hello, World!"); };
   aBlock();

解释一下上面那段东西时鬼东西把。首先 void 表示block的返回值为void。然后就是(^aBlock) 表示这个block的名字叫 aBlock。然后就是 (void) 表示 这个block 没有参数。

简而言之就是: 返回类型(^Block名字)(形式参数)

然后等号之后就是一个类似于匿名函数的东西。^(没有参数){具体实现}。

Important Pont:Block的内存是分配在栈上的。

2 block中修改外部变量
这个答案是NO。block中不允许随意修改一般的外部变量。因为block支持并行运行,多个线程同时访问一个变量是有问题的一件事。所以要加 __block.或者是static 变量.

   __block int blockLocal = 100;
   static int staticLocal = 100;
   void (^aBlock)(void) = ^(void){ 
             NSLog(@" >> Sum: %d\n", global + staticLocal);
             global++;
             blockLocal++;
             staticLocal++;
};
aBlock();

Block 在GCD中的总结

1 结合GCD在异步队列中的block

    dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
    dispatch_async(queue, ^(void) 
    {
       int sum = 0;
       for(int i = 0; i < Length; i++)
       sum += data[i];
       NSLog(@" >> Sum: %d", sum);flag = YES;
    });
       // wait util work is done.//
        while (!flag);
       dispatch_release(queue);

如果没有这个while 主线程就会马上结束,因为 block中的操作时放在异步线程中的。家while的目的是为了让主线程等待,block结束。

2 block按照 FIFO的原则
block按照 FIFO的原则去执行,也就是先添加到异步队列中的block有有限执行权力(同一线程中,遵循FIFO)。

我们可以通过型号量机制来看看。

// Create a semaphore with 0 resource
//
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block dispatch_semaphore_t taskSem = dispatch_semaphore_create(0);

// create dispatch semaphore
//
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);

dispatch_block_t task1 = ^(void) {
     int s = 0;
     for (int i = 0; i < Length; i++)
     s += data[i];
     sum = s;

     NSLog(@" >> after add: %d", sum);

     dispatch_semaphore_signal(taskSem);
};

dispatch_block_t task2 = ^(void) {
     dispatch_semaphore_wait(taskSem, DISPATCH_TIME_FOREVER);

     int s = sum;
     for (int i = 0; i < Length; i++)
     s -= data[i];
     sum = s;

     NSLog(@" >> after subtract: %d", sum);
     dispatch_semaphore_signal(sem);
};

dispatch_async(queue, task1);
dispatch_async(queue, task2);

// wait for the semaphore: wait until resource is ready.
//
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

dispatch_release(taskSem);
dispatch_release(sem);
dispatch_release(queue);

这里大致就是用GCD 实现了依赖。

参考和致谢

link:http://www.cnblogs.com/kesalin/archive/2011/08/26/block_dispatch_queue.html

相关文章

  • Block简介和在GCD中的举例

    Block简介 Block的使用 1 如何用block实现 hello world!!! 解释一下上面那段东西时鬼...

  • NSOperation和GCD

    NSOperation和GCD如何选择 GCD以block为单位,代码简洁。同时GCD中的队列、组、信号量、sou...

  • iOS开发多线程篇--GCD

    目录: 一 GCD简介 二 GCD中的队列 三 注意点 一 GCD简介 1 什么是GCD? 全称是Grand Ce...

  • GCD任务、队列、线程复用、AFN3.0同步请求的尴尬

    该换换刷新·KafkaRefresh 3 GCD的使用 3.1 __block的设计思想及GCD中的ARC机制 在...

  • iOS: GCD详尽总结

    GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行。gcd中...

  • iOS Block完全使用指南

    1、Block的声明 格式: 举例: 2、Block的定义 格式: 举例: Tips:快速生成Block定义:在方...

  • iOS GCD中的三种队列类型

    GCD中的三种队列类型 GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某...

  • GCD队列和死锁解析

    GCD核心概念 任务 :执行GCD函数block(代码块)中的代码 队列 :用来存放任务的队列,遵循FIFO原则 ...

  • 拨开GCD的面纱

    之前我在博客中也说过了,关于GCD和block是很多新手的两大拦路虎,下面谈谈GCD。 GCD是iOS中异步执行任...

  • GCD多线程使用

    (一)GCD 使用步骤 演示过程创建任务 - block dispatch_block_t block ...

网友评论

      本文标题:Block简介和在GCD中的举例

      本文链接:https://www.haomeiwen.com/subject/dnomqttx.html