IOS:dispatch_group_enter的学习
来源:互联网 发布:淘宝怎么改差评为好评 编辑:程序博客网 时间:2024/05/16 10:06
dispatch_group的作用:创建一个任务组,然后异步执行加入group的每个任务。比如如果用group管理3个任务的执行,那么这3个任务的执行顺序会同时执行。
dispatch_enter的作用:创建好任务组后,执行加入任务组的操作代码。dispatch_enter和dispatch_leave要成对出现,否则奔溃。
//1.创建任务组 dispatch_group_t group = dispatch_group_create(); //2.加入第一个任务 dispatch_group_enter(group); BlockView *blockView = [[BlockView alloc] init]; //设置block10秒后回调 [blockView returnTextFieldWithBlock:^(NSString *text) { NSLog(@"任务组1完成"); /* 在这里我们设置的dispatch_group_wait时间是5秒,但是我们这个任务的回调时间是10秒。所以结果是5秒过后wait超时,程序继续往下执行,打印:wait时间已经到了。然而这个任务还在线程里执行,一直到执行dispatch_group_leave这个任务才完成。 */ dispatch_group_leave(group); }]; //3.加入第二个任务 dispatch_group_enter(group); /* 这里我发现一个问题,我设置的dispatch_after的延时时间是3秒,也就是3秒后把block中的任务加入线程。所以是在dispatch_group_wait时间内就能完成的,但是打印的顺序却是先打印:wait时间已经到了,然后打印:任务组2完成, */ dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, 3*NSEC_PER_SEC); dispatch_after(tt, dispatch_get_main_queue(), ^{ NSLog(@"任务组2完成"); dispatch_group_leave(group); }); //4.加入第三个任务 dispatch_group_enter(group); NSLog(@"任务组3完成"); dispatch_group_leave(group); //5.执行到这句代码后会等待5秒,等待关联的任务组group里的所有任务完成。如果在5秒内都完成了,返回0并继续执行;如果超时未完成,放回非0并继续执行。所以任务组里的任务无论是否全部完成,都会继续执行。 dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC))); NSLog(@"wait时间已经到了"); //6.notify会简体关联的任务组group中的所有任务是否都已完成(dispatch_group_enter和dispatch_group_leave匹配),完成了就会执行block dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"所有任务组都完成了"); });
在这里,dispatch_group_wait设置超时时间,如果任务组group里的任务在超时时间内完成,就直接继续执行;而超时未完成,那么时限到后还是会继续执行!那么dispatch_group_wait的作用是什么呢?
一个任务是否完成,就看dispatch_group_enter和dispatch_group_leave是否成对出现。如果任务组里加入的所有任务都都成对出现了enter和leave,那么任务组就完成。所以dispatch_group_wait的作用相当于是对子线程的阻塞式延时,延时的最大时间就是超时时间。
比如下面的代码:设置dispatch_group_wait超时时间为5秒,如果5秒内block回调,则返回isOK=YES,否则返回isOK=NO;
- (BOOL)doDispathcGroup{ __block BOOL isOK = NO; dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); BlockView *blockView = [[BlockView alloc] init]; [blockView returnTextFieldWithBlock:^(NSString *text) { isOK = YES; dispatch_group_leave(group); }]; dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC))); return isOK;}
在上面的代码执行的时候我有过一个问题,不是说enter和leave是要成对出现的吗?那么如上面的代码,leave还没出现就return不会导致奔溃吗?答案是不会的,因为任务是在开辟的线程里执行的,线程没有结束,那么group就不会结束,相当于线程还是在等待leave。这个方法域的return不会结束线程。
2 0
- IOS:dispatch_group_enter的学习
- iOS dispatch_group_enter的使用
- iOS - dispatch group用法(dispatch_group_leave、dispatch_group_enter)
- 记录dispatch_group_enter()和dispatch_group_leave()的使用
- dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步
- dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步
- 学习ios的感悟
- ios的ASIHTTPRequest学习
- 学习Ios的心得体会
- iOS self.的学习
- iOS NSInvocation的学习
- IOS CADisplayLink的学习
- IOS的学习路线图
- IOS的学习路线图
- IOS学习 dwarfdump的
- iOS 手势的学习
- 学习ios的网站
- iOS的学习生活
- curl http调试restful接口
- Oracle中的left join、right join、inner join
- Shell教程(三):数组/Arrays、基本运算符
- android绑定远程服务以及android接口定义语言(aidl)
- SCI论文从入门到精通
- IOS:dispatch_group_enter的学习
- 卫星导航术语 -- 词汇与概念解释(200条)(转自今日北斗)
- Android blueZ HCI(一):hciconfig实现及常用方法
- URI,URN,URL三者的关系
- C++11 并发实战阅读笔记(2)
- 让apache支持CGI
- having与group by
- 设计模式之迭代器模式
- Visual Studio系列 卸载visual assist插件和vmware debugger插件的方法