代码是这样的:
NSDateFormatter *formatter;
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMdd"];
for (int i=0; i<10000; i++) {
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(aQueue, ^{
NSString *dateKey = [formatter stringFromDate:[NSDate date]];
NSLog(dateKey);
});
}
日期密钥有时会47130101吗?正常值类似于20120608。但我有时会47130101。
您的代码完全有效,我尝试了几次检查,它是有效的。
试试这个:
NSLog(@"%@", dateKey);
你会看到它。可能您在其他部分感到困惑。
您绝对不希望同时在多个线程上使用相同的NSDateFormatter
对象。
线程安全确实指示 NSDateFormatter 明确地不安全。
我建议,如果你无论如何都要在GCD中这样做,你要么使用多个NSDateFormatters(如果你真的需要做10,000个这样的工作,可能是一个池),或者如果你的主要关注点是"意外"在多个线程中使用它,则使用单线程访问。
如果您选择后者,我会为 NSDateFormatter 创建一个专用的串行调度队列,并使用它来控制访问,以便它一次只能在一个线程上运行,但否则,如果您不太可能发生冲突,则会快速执行。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMdd"];
NSString *dateKey = [formatter stringFromDate:[NSDate date]];