block 的定义 回传值 (^名字) (参数列);
主要分成3部分 返回值 名称 和参数。 当没有的时候 可以省略。
int (^ myinttest)(int) = ^(int a){
return -a;
};
int a = myinttest(100);
NSLog(@"%d",a);
typedef int (^ negative)(int);
negative getNegative = ^(int a){
return -a;
};
int a = getNegative(100);
NSLog(@"%d",a);
block内部对于外部的访问。其实是复制一份。就类似java的传参。对于基本类型。是值传递(复制一份)。对于对象(指针)传递的是指针的备份。注意 这里复制的对象是只读的。不可以修改
想要修改外部变量就需要用到__block。
在这里需要注意 原本是在栈上面的变量(基本类型)需要copy到堆上面去。如果使用了__block的话。会将外部变量的地址变成新的堆上面的地址。
dispatch_get_main_queue()
dispatch_queue_t myqueue =dispatch_queue_create("com.aurora.test",DISPATCH_QUEUE_CONCURRENT);
第一个参数是一个附带的字符串。可以为nil 。这个主要是给调试工具使用的。可以理解为这个队列的名字;不易理解为队列的 id。 不决定 队列的唯一性。自己命名的时候 要去不相同的。即使取相同的 也是2个队列。
第二参数就是队列的类型:
DISPATCH_QUEUE_CONCURRENT 并行
DISPATCH_QUEUE_SERIAL 串行
总之 GCD 的使用理解清楚2个:
1 。请求是分同步调用 和异步调用 。 看方法名称可以看出来。
2 。队列是分串行 并发
下面 有一些扩展:
是延后一定的时间 激活队列。注意的是 并不是 表示 多少时间之后 一定执行。可以理解为 一定的时间后将这个任务加到队列里面去。至于什么时候执行。需要看队列的情况了。
dispatch_after(time, myqueue, ^{
});
使用方法如上。多了第一个参数 表示的时间
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)1 * NSEC_PER_SEC);
构建时间参数 第一个参数看名字就知道 是现在。 第二个参数是时间 是 毫微秒(十亿分之一秒)系统定义了几个常量。 所以乘以这些常量就ok了。
注意 dispatch_after 是 异步调用的。所以不需要等待block执行完毕就返回;
这个是指重复多少次
dispatch_apply(10, myqueue, ^(size_t i) {
});
这个就是加入10个到队列中去。这个 调用是同步的 。需要等十次执行完 才会返回.
保证队列只执行一次
static dispatch_once_t onece;
dispatch_once(&onece, ^{
NSLog(@"my one");
});
这个是分组。对于一些队列 你可能希望将他们分为一组进行操作。也需需要等这一组执行玩后 做一些逻辑。这时候 这个就有大作用了。
dispatch_queue_t myqueue = dispatch_queue_create("com.aurora.test", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t mygroup = dispatch_group_create();
dispatch_group_async(mygroup, myqueue, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"111");
});
dispatch_group_notify(mygroup, dispatch_get_main_queue(), ^{
NSLog(@"all end");
});
dispatch_group_async(mygroup, myqueue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"222");
});
也可用
dispatch_group_enter
dispatch_group_leave
dispatch_group_wait
组合使用 来达到这个目的 不过 wait 是 会阻塞线程的 这个需要注意
dispatch_queue_t myqueue = dispatch_queue_create("com.aurora.test", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t mygroup = dispatch_group_create();
dispatch_group_async(mygroup, myqueue, ^{
dispatch_group_enter(mygroup);
[NSThread sleepForTimeInterval:4];
NSLog(@"111");
dispatch_group_leave(mygroup);
});
// dispatch_group_notify(mygroup, dispatch_get_main_queue(), ^{
// NSLog(@"all end");
// });
dispatch_group_async(mygroup, myqueue, ^{
dispatch_group_enter(mygroup);
[NSThread sleepForTimeInterval:5];
NSLog(@"222");
dispatch_group_leave(mygroup);
});
dispatch_group_wait(mygroup, DISPATCH_TIME_FOREVER);
NSLog(@"end");