Grand Central Dispath(GCD) 是在MacOS X10.6中退出,然后在IOS4.0中加以应用,相对于NSThread、NSOperation等更加方便
我们平时在访问网络时,必须要在子线程中进行,不然会造成主线程堵塞,更新界面等都在主线程中进行,如果主线程堵塞,那么界面将会卡的不动
下面是一段使用gcd访问网络的代码
//子线程访问网络
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url = [NSURL URLWithString:@"www.test.com"];
NSError *error;
NSString *data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (data) {
//主线程更新界面
dispatch_async(dispatch_get_main_queue(), ^{
self.content.text = data;
});
}else{
NSLog(@"%@",error);
}
});
苹果为我们提供了一些方便我们使用的代码
//后台执行-子线程执行
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//doto
});
//主线程执行
dispatch_async(dispatch_get_main_queue(), ^{
//todo
});
//一次性执行
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//todo
});
//延迟5秒执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//todo
});
返回主线程也可这么写
//后台执行-子线程执行
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//doto
//返回主线程
[self performSelectorOnMainThread:@selector(doSomething:) withObject:@"test" waitUntilDone:NO];
});
- (void)doSomething:(NSString *)string{
}
gcd其他用法:
如:先执行其他线程, 此线程执行完后再执行最后的线程
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//线程1
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//线程2
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
//线程1和2执行完毕后执行此线程3
});
注:
dispatch_get_global_queue(0, 0)即代表子线程
dispatch_get_main_queue()代表主线程