您的位置:首页 > 其它

模拟dispatch_once

2016-05-30 09:20 375 查看

dispatch_once

dispatch_once可以保证一段代码只被执行一次,因此出现之后使用最多的场景就是实现单例。本文来模拟实现dispatch_once的功能。

模拟dispatch_once

直接上代码

staticNSMutableDictionary
*lockMapping=nil;
voiddo_once(int*predicate,void(^block)()){
if(*predicate!=-1){
NSLock*lock=nil;
@synchronized([NSObjectclass]){
NSLog(@"getlock");
if(lockMapping==nil){
lockMapping=[NSMutableDictionarydictionary];
}
NSString*key=[NSStringstringWithFormat:@"%p",predicate];
if(![lockMappingobjectForKey:key]){
[lockMappingsetObject:[[NSLockalloc]init]forKey:key];
}

lock=[lockMappingobjectForKey:key];
}

[locklock];
if(*predicate!=-1){
block();
*predicate=-1;
}

[lockunlock];
}
}

原理很简单,就不做过多解释了。使用:

@interfaceTest:NSObject
(instancetype)shareInstance;
@end

@implementationTest

(instancetype)shareInstance{
staticinttoken;
staticTest*t=nil;
do_once(&token,^{
t=[[Testalloc]init];
NSLog(@"executeonce");
});
NSLog(@"executeeverytime");
returnt;
}@end


测试:

intmain()
{for(inti=0;i<100;i++){
dispatch_async(dispatch_queue_create(0,DISPATCH_QUEUE_CONCURRENT),^{
[TestshareInstance];
});
}
[[NSRunLoopcurrentRunLoop]runUntilDate:[NSDatedistantFuture]];
return0;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: