2013-07-31 46 views
2
+(NSString*)FromNumber:(NSNumber*)number 
{ 
    NSString *key = akey; 
    NSNumberFormatter *numberFormatter = [[[NSThread currentThread] threadDictionary] objectForKey:key]; 
    if(!numberFormatter) 
    { 
     numberFormatter = [self getDecimalNumberFormatterWithDigits:2]; 
     [numberFormatter setFormatterBehavior:NSNumberFormatterPercentStyle]; 

     [numberFormatter setNegativeSuffix:@"%"]; 
     [numberFormatter setPositiveSuffix:@"%"]; 
     [numberFormatter setNilSymbol:@""]; 
     [numberFormatter setLocale:[ISMDateUtilities enUSPosixLocale]]; 

     [[[NSThread currentThread] threadDictionary] setValue:numberFormatter forKey:key]; 
    } 
    return [numberFormatter stringForObjectValue:number]; 
} 

我很好奇的是使用threadDictionary来同步一块代码?这段代码是否通过使用threadDictionary来保证线程安全?

谢谢!

回答

4

该代码的线程安全性取决于akey是一个常量。如果是,那么是的,这个方法是线程安全的,因为它不共享线程之间的任何状态。 (虽然我不确定你的意思是“同步”,尽管这里没有同步功能。)

+1

真正的问题是*你真的需要每线程号码格式化程序吗?! *看起来很奇怪,想要根据正在运行的线程更改数字的格式?!我最好的猜测是OP可以更好地通过类方法+ dispatch_once()来初始化所述方法中的单例格式化程序。 – bbum

+1

@bbum'NSNumberFormatter'的文档声明该类不是线程安全的。但目前还不清楚这是否意味着单个格式化程序可以同时格式化或解析来自不同线程的多个值。 – rmaddy

+1

啊 - 是的 - 那。我忘了那个。尽管如此,每个线程格式化程序仍然尖叫着“不受控制的并发设计”。我会倾向于一个并发模型la CoreData;严格控制,只有一个或两个(主要+工人)队列可能发生格式化。 – bbum