2011-08-25 32 views
2

我有一些代碼需要一個NSString作爲輸入,並使用該字符串來創建一個對象。我需要確保它不會在同一個字符串上運行兩次,例如如果從不同的線程調用,或者即使同一個線程試圖遞歸地執行它。iOS - 試圖設置一個鎖字典

我可以通過製作我的初始化對象的字典開始,如果再次傳遞相同的字符串,則抓取該對象。但是這仍然會導致當其他代碼初始化時第二次請求對象時發生的情況。

我看到Apple爲我提供了NSLock類。我對如何將其應用於我的問題感到茫然。我看到蘋果公司讓我給我的鎖命名,但我沒有看到任何方式使用給定的名字訪問鎖。我想我可以製作一個鎖的字典,但即使這看起來並不難 - 如果兩個線程試圖同時鎖定相同的名稱會怎麼樣?

任何人都可以在正確的方向指向我嗎?

+0

鎖名稱僅用於調試目的;否則調試器將只能告訴你線程2持有鎖0x02303342,就是這樣。 – benzado

回答

3

如何使用所有字符串製作靜態NSMutableArray並同步您的代碼。

當然,你首先需要的地方初始化數組;)

也許是這樣的:

static NSMutableArray* myArrayWithStrings; 

-(void) someMethod:(NSString*) key 
{ 
    @synchronized(myArrayWithStrings) 
    { 
     if(![myArrayWithStrings containsObject:key]) 
     { 
      NSLog(@"Working with the key %@", key); 
      [myArrayWithStrings addObject:key]; 

     }else 
     { 
      NSLog(@"Ignoring key '%@'. Already worked with it.",key); 
     } 
    } 
} 
+1

雖然'NSMutableSet'實例會更合適,它可以工作。 – benzado

+1

另外,重要的是:你應該初始化@synchronized塊的外部對象,否則每個其他線程都會被阻塞,即使它可以繼續。 – benzado