</pre><pre name="code" class="html"><span style="font-size:18px;">区别</span>
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 处理耗时操作的代码块...
UIImage *image = [UIImage imageNamed:@"bb.jpg"];
UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 160, 240)];
[imageV setImage:image];
[self.view addSubview:imageV];
sleep(3);
//通知主线程刷新
dispatch_async(dispatch_get_main_queue(), ^{
//回调或者说是通知主线程刷新,
NSLog(@"update main");
});
});
以上代码在子线程添加视图 要许久(大于3秒)之后才能在UI上显示图片===========================================================================================
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 处理耗时操作的代码块...
UIImage *image = [UIImage imageNamed:@"bb.jpg"];
UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 160, 240)];
[self.view addSubview:imageV];
sleep(3);
//通知主线程刷新
dispatch_async(dispatch_get_main_queue(), ^{
//回调或者说是通知主线程刷新,
[imageV setImage:image];
NSLog(@"update main");
});
});
以上代码在子线程添加视图 然后3秒后通知主线程更新UI(正常做法)
[NSThread detachNewThreadSelector:@selector(aa) toTarget:self withObject:nil];
-(void)aa
{
sleep(3);
UIImage *image = [UIImage imageNamed:@"bb.jpg"];
UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 160, 240)];
if(image!=nil)
{
//跟新主线程(线程的通信)
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
} [self.view addSubview:imageV];
}
以上效果类似于第二种
开启一个线程:dispatch_async
全局线程队列:dispatch_get_global_queue(0, 0)
优先级:2 ,0, -2主线程: dispatch_get_main_queue()
线程锁
//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(4);
[self method1];
});
//线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
[self method2];
});
以上代码的结果:
2014-07-22 21:23:35.663 demo[13769:3603] method2
2014-07-22 21:23:38.663 demo[13769:3503] method1
NSLock *lock = [[NSLock alloc] init];
dispatch_async(dispatch_get_global_queue(0,0), ^{
@synchronized(lock){
sleep(4);
[self method1];
}
@synchronized(lock){
sleep(1);
[self method2];
}
});
以上代码结果:2014-07-22 21:24:17.498 demo[13787:3503] method1
2014-07-22 21:24:18.500 demo[13787:3503] method2
NSLock
NSLock *lock = [[NSLockalloc]init];
//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
sleep(4);
[locklock];
[selfmethod1];
[lockunlock];
sleep(1);
[locklock];
[selfmethod2];
[lockunlock];
});
以上代码结果:2014-07-22 21:27:22.029 demo[13837:3503] method1
2014-07-22 21:27:23.030 demo[13837:3503] method2
:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"延迟2秒调用");
});
/* 1.dispatch_async 异步处理好使的操作 */
//获取全局队列(三种)
dispatch_queue_t golbalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_queue_t mainQ =dispatch_get_main_queue();
dispatch_async(dispatch_get_global_queue(0,0), ^{
NSLog(@"开启子线程:dispatch_get_global_queue");
sleep(3);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新主线程:dispatch_get_main_queue");
});
});
/*
2、dispatch_group_async的使用
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, ^{
sleep(1);
NSLog(@"group1-随机执行");//随机执行
});
dispatch_group_async(group, queue, ^{
sleep(1);
NSLog(@"group2-随机执行");//随机执行
});
dispatch_group_async(group, queue, ^{
sleep(1);
NSLog(@"group3-随机执行");//随机执行
});
dispatch_group_notify(group, queue, ^{
NSLog(@"update(只有等上面三个group1,group2,group3执行完毕之后才会调用)");
});
/*
3、dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
*/
// dispatch_queue_t queueBarrier = dispatch_get_global_queue(0, 0);
//queueBarrier这个队列不能是全局的dispatch_get_global_queue(0, 0)必须自己定义一个队列
dispatch_queue_t queueBarrier =dispatch_queue_create("gcdtest.rongfzh.yc",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queueBarrier, ^{
sleep(1);
NSLog(@"b1随机执行");
});
dispatch_async(queueBarrier, ^{
sleep(1);
NSLog(@"b2随机执行");
});
dispatch_barrier_async(queueBarrier, ^{
sleep(0);
NSLog(@"dispatch_barrier_async只有等之前做的做完才会执行后面的线程至于它执行完毕后才执行");
});
dispatch_async(queueBarrier, ^{
sleep(1);
NSLog(@"b3随机执行");
});
/*
4、dispatch_apply
执行某个代码片段N次。
*/
dispatch_apply(5,dispatch_get_global_queue(0,0), ^(size_t index) {
sleep(1);
NSLog(@"dispatch_apply执行某个代码片段5次 %ld",index);
});
/**
* 只会执行一次
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sleep(1);
NSLog(@"dispatch_once 只会执行一次");
});
//创建一个信号量:2
dispatch_semaphore_t semaphores = dispatch_semaphore_create(2);
for (int i = 0; i<10; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"==== %d",i);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//释放资源 发出信号量
//dispatch_semaphore_signal(semaphores);
});
});
}
//等待资源
dispatch_semaphore_wait(semaphores, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphores, DISPATCH_TIME_FOREVER);
//当没有资源释放的时候 线程就堵住了
dispatch_semaphore_wait(semaphores, DISPATCH_TIME_FOREVER);