GCD多线程
2017-05-29 本文已影响0人
AsABurger
系统提供的dispatch方法
//后台执行:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//something
});
//主线程执行:
dispatch_async(dispatch_get_main_queue(),^{
//something
});
//一次性执行:
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
//code to be executed once
});
//延迟两秒执行
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
//code to excuted on the main queue after delay
});
自定义一个dispatch_queue_t
dispatch_queue_t urls_queue = dispatch_queue_create("queueName", NULL);
dispatch_async(urls_queue, ^{
//your code
});
// dispatch_release(urls_queue);
让后台两个线程并行执行,等待两个线程都结束后,再汇总执行结果
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//并行执行的线程一
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//并行执行的线程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
//当一二执行完后执行的结果
});
修改block之外的变量
默认情况下,block中访问的外部变量是复制过去的,写操作不会对原变量生效。在变量前加__block可让写操作生效。
__block int a = 0;
void (^foo)(void) = ^{
a = 1;
};
foo();
以上内容整理自唐巧的《iOS开发进阶》一书
声明一个带有返回值和参数的block
int (^func)(int,int) = ^(int a,int b){
a = a + b;
return a;
};
int b = func(3,4);