Block简介和在GCD中的举例

2015-07-30  本文已影响449人  David_Cap

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

上一篇 下一篇

猜你喜欢

热点阅读