|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
以后一定会坚持多读些相关的书籍,在这里也要感谢一下“清源教育”的老师对我学习中极大的帮助,每次有不懂得问题,都及时得到了他们的回答。想说说被放弃的dispatch_get_current_queue,不能不提一个观点:可重进。
甚么是可重进,来自维基百科:若一个程序或子程序能够“平安的被并行实行(Parallelcomputing)”,则称其为可重进(reentrant或re-entrant)的。
即当该子程序正在运转时,能够再次进进并实行它(并行实行时,一般的实行了局,都切合计划时的预期)。
若一个函数是可重进的,则该函数:
- 不克不及含有静态(全局)十分量数据
- 不克不及前往静态(全局)十分量数据的地点
- 只能处置由挪用者供应的数据
- 不克不及依附于单实例形式资本的锁
- 不克不及挪用(call)不成重进的函数(有呼唤(call)到的函数需满意前述前提)
偶然候我们很但愿晓得以后实行的queue是谁,好比UI操纵必要放在mainqueue中实行。假如能够晓得以后事情的queue是谁,就能够很便利的指定一段代码操纵在特定的queue中实行。dispatch_get_current_queue()恰好能帮上忙。因而乎,在指定的queue中做一些操纵,就能够十分明晰的完成:
- voidfunc(dispatch_queue_tqueue,dispatch_block_tblock)
- {
- if(dispatch_get_current_queue()==queue){
- block();
- }else{
- dispatch_sync(queue,block);
- }
- }
然后潜认识里,以为这个函数是可重进的。
但当targetqueue刚好是currentqueue时,同步堵塞会招致逝世锁。
- -(void)deadLockFunc
- {
- dispatch_queue_tqueueA=dispatch_queue_create("com.yiyaaixuexi.queueA",NULL);
- dispatch_queue_tqueueB=dispatch_queue_create("com.yiyaaixuexi.queueB",NULL);
- dispatch_sync(queueA,^{
- dispatch_sync(queueB,^{
- dispatch_block_tblock=^{
- //dosomething
- };
- func(queueA,block);
- });
- });
- }
成绩出在GCD行列自己是不成重进的,串行同队伍列的层级干系,是呈现成绩的基本缘故原由。
为了避免相似的误用,苹果在iOS6放弃了dispatch_get_current_queue()办法。壮大的dispatch_get_current_queue()也只能看成一个调试工具了。
那末应当怎样包管GCD办法可重进呢?
- dispatch_queue_set_specific标志行列
- 递回锁
分离给出两种办法的示例代码片断:
1)dispatch_queue_set_specific
- dispatch_queue_tqueueA=dispatch_queue_create("com.yiyaaixuexi.queueA",NULL);
- dispatch_queue_tqueueB=dispatch_queue_create("com.yiyaaixuexi.queueB",NULL);
- dispatch_set_target_queue(queueB,queueA);
- staticintspecificKey;
- CFStringRefspecificValue=CFSTR("queueA");
- dispatch_queue_set_specific(queueA,
- &specificKey,
- (void*)specificValue,
- (dispatch_function_t)CFRelease);
- dispatch_sync(queueB,^{
- dispatch_block_tblock=^{
- //dosomething
- };
- CFStringRefretrievedValue=dispatch_get_specific(&specificKey);
- if(retrievedValue){
- block();
- }else{
- dispatch_sync(queueA,block);
- }
- });
2)递回锁
- voiddispatch_reentrant(void(^block)())
- {
- staticNSRecursiveLock*lock=nil;
- staticdispatch_once_tonceToken;
- dispatch_once(&onceToken,^{
- lock=[[NSRecursiveLockalloc]init];
- });
- [locklock];
- block();
- [lockunlock];
- }
- dispatch_queue_tqueueA=dispatch_queue_create("com.yiyaaixuexi.queueA",NULL);
- dispatch_block_tblock=^{
- //dosomething
- };
- dispatch_sync(queueA,^{
- dispatch_reentrant(block);
- });
由于封闭文档写的相当好在遇到新框架的时候弄明白框架的功能去文档里搜搜框架的ProgrammingGuide很有用要弄明白框架类的继承结构写iOS的程序不一定都是用OBJC |
|