2012-06-08 60 views
0

代碼如下:格式化之後的NSDate返回47130101?

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); 


    }); 

} 

是datekey有時47130101? 正常值就像20120608. 但我有時會得到47130101。

+1

有時候你的意思是什麼?這種用法的背景是什麼? – giorashc

+0

我更改了示例代碼。 – cuichang

回答

-4
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyyMMdd"]; 
    NSString *dateKey = [formatter stringFromDate:[NSDate date]]; 
+0

與yyyyMMdd有什麼不同? – giorashc

+1

是相同的代碼... –

+0

是的,它是一樣的,我只是從項目中粘貼了一個代碼(我刪除了「 - 」) – self

1

你的代碼是完全有效的,我試了一下檢查,它是有效的。

試試這個:

NSLog(@"%@", dateKey); 

你會看到它。其他部分可能會讓你感到困惑。

+0

NSLog(@「%@」,dateKey);不改變任何東西,我嘗試它,它是相同的結果,我不能得到47130101。 – cuichang

+0

它不會改變任何顯示變量總是正確的東西,真的,您的代碼可以正常工作,在其他部分查找錯誤。 –

+0

我明白你說的,在示例代碼中,結果總是正確的,但在我的應用程序中,它有時會返回錯誤的結果,在我的應用程序中使用dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_async(aQueue,^ {以異步方式運行代碼,我認爲可能是它的問題。 – cuichang

0

您絕對不希望在多個線程上同時使用相同的NSDateFormatter對象。

Thread Safety確實表明NSDateFormatter顯式線程不安全。

我會建議,如果你打算在GCD中做這個,你要麼使用多個NSDateFormatters(如果你真的需要做10,000個這樣的可能是一個池),或者如果你主要關心的是單線程訪問「意外」在多個線程中使用它。

如果您選擇後者,我會爲NSDateFormatter創建一個專用的串行調度隊列,並使用它來控制訪問,以便它一次只能在一個線程上運行,否則將在不太可能時快速執行你會遇到碰撞。