2011-08-25 37 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