GCD(Grand Center Dispatch ),比NSThread ,NSOperationQueue、NSInvocationOperation相比,使用起来更加方便
用例描述:模拟下载一个东西,可以放到后台,这样不影响UI,下载完成后再更新UI
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong)UIActivityIndicatorView * indicator;
@property (nonatomic, strong)UILabel * content;
@end
@implementation ViewController
- (UIActivityIndicatorView *)indicator{
if (_indicator== nil) {
self.indicator = [[UIActivityIndicatorView alloc] init];
}
return _indicator;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)startWithGCD{
self.indicator.hidden = NO;
[self.indicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_TARGET_QUEUE_DEFAULT, 0), ^{
NSURL * url = [NSURL URLWithString:@"https:www.youdao.com"];
NSError * error;
NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:& error];
if (data !=nil) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.indicator stopAnimating];
self.indicator.hidden = YES;
self.content.text = data;
});
}else{
NSLog(@"error when download :%@",error);
}
});
- (void)testGCD{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//后台执行
});
dispatch_async(dispatch_get_main_queue(), ^{
//主线程执行
});
//一次性执行,比如用于创建单例
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//
});
【-------》
创建单例单例另一种方法:采用互斥锁
http://blog.163.com/hongbin89@126/blog/static/112853955201302794741414/
@synchronized
作用:创建了一个互斥锁,它的作用和其他语言中的互斥锁作用一样
解释:这个是OBC中的一个锁定令牌,方式一个对象在同一时间内被其他线程访问,起到了线程保护的作用
使用范围:一般在单例模式或者操作类的static变量的时候使用,即共用的变量的时候
外延:这个令牌隐式的包含了异常处理,如果你不想使用的话,就使用锁吧
例子:
static BlocDataRequest *manager = nil;@implementation BlocDataRequest
+ (BlocDataRequest *)sharedInstance{
@synchronized(self){
if (manager == nil) {
manager = [[BlocDataRequest alloc] init];
}
}
return manager;
}
】
//延迟2秒
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(){
});
//让后台两个线程并行执行,等两个线程都结束后,再汇总执行结果。用dispatch_group,dispatch_group_async和dispatch_group_notify来实现。
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), ^{
//汇总结束
});
}
//http://blog.csdn.net/shao941122/article/details/50854865 职业建议