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