看朋友的分享文档记录下。
GCD:Grand Central Dispatch
dispatch_once:执行一次,可用于单例。
+ (id)sharedInstance{
static SomeClass *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
dispatch_after:延时执行,可用于。
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull *
NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^{!
NSLog(@"waited at least three seconds.“);
});
dispatch_apply:执行多次。
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);!
dipatch_apply([array count], queue, ^(size_t index){!
NSLog(@“%zu”, [array objectAtIndex:index]);!
});!
NSLog(@“done”);
dispatch_group_async:监听多个任务是否完成,完成后可以得到通知执行其它操作。
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_group_async(group, queue, ^(){
//do something
dispatch_group_async(group, dispatch_get_main_queue(), ^(){
self.foo = 23;
});
});
dispatch_group_async(group, queue, ^(){
//do something
dispatch_group_async(group, dispatch_get_main_queue(), ^(){
self.bar = 11;
});
}); dispatch_group_notify(group, dispatch_get_main_queue(), ^(){
NSLog(@“foo is %d”, self.foo);
NSLog(@“bar is %d”, self.bar);
});
dispatch_barrier_async:是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行。
dispatch_queue_t queue = dispatch_queue_create(“com.example.gcd.barrier”,
DISPATCH_QUEUE_CONCURENT);
dispatch_async(queue, blk0_for_reading);
dispatch_async(queue, blk1_for_reading);
dispatch_async(queue, blk2_for_reading);
dispatch_async(queue, blk3_for_reading);
dispatch_barrier_async(queue, blk_for_writing);
dispatch_async(queue, blk4_for_reading);
dispatch_async(queue, blk5_for_reading);
dispatch_async(queue, blk6_for_reading);
dispatch_semaphore:信号量是一个整型值并且具有初始计数值,信号量通常支持两个操作:通知和等待。当信号被通知的时候计数值会增加,当信号量在线程上等待的时候,必要的情况下线程会被阻塞掉,直至信号被通知时计数值大于0,然后线程会减少这个计数继续工作。
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i < 100000; i++)
{
dispatch_async(queue, ^{!
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);!
[array addObject:[NSNumber numberWithInt:i]];!
dispatch_semaphore_signal(semaphore);!
});
}
dispatch_sync:
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{NSLog(@“never run…”);});
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{NSLog(@“never run…”);});
dispatch_async(queue, ^{
});
dispatch_sync(queue, ^{NSLog(@“never run…”);});
dispatch_async(queue, ^{
});
异步加载图片的示例:
- for (int i = 0 ; i < 10; i++) {
- dispatch_async(dispatch_get_global_queue(0, 0), ^{
- // 处理耗时操作的代码块...
- UIImage *img = [self getImgeWith:[urlArr objectForIndex:i]];
- //通知主线程刷新
- dispatch_async(dispatch_get_main_queue(), ^{
- //回调或者说是通知主线程刷新,
- [myImgV[i] setImage:img];
- });
-
- });
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- // 耗时的操作
- dispatch_async(dispatch_get_main_queue(), ^{
- // 更新界面
- });
- });
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];
- NSData * data = [[NSData alloc]initWithContentsOfURL:url];
- UIImage *image = [[UIImage alloc]initWithData:data];
- if (data != nil) {
- dispatch_async(dispatch_get_main_queue(), ^{
- self.imageView.image = image;
- });
- }
- });