2013-04-22 157 views
2

我正在开发一个iOS 5.0+应用程序与最新的SDK。NSCondition或@synchronized

我有这样的代码:

@interface ServerManager() 
{ 
    NSCondition* statusLock; 

[ ... ] 

} 

@end 

@implementation ServerManager 

[ ... ] 

- (void)setStatus:(ServerStatus)newStatus 
{ 
    [statusLock lock]; 

    status = newStatus; 

    [statusLock unlock]; 
} 

如果我改变- (void)setStatus:(ServerStatus)newStatus实现这一个:

- (void)setStatus:(ServerStatus)newStatus 
{ 
    @synchronized(statusLock) 
    { 
     status = newStatus; 
    } 
} 

我做一样的吗?

这是我第一次使用NSThread工作,我不知道iOS上的锁是如何工作的。

+0

你真的需要自定义存取方法吗?否则,你可以定义'@property(atomic)ServerStatus;' – 2013-04-22 10:48:29

+0

@MartinR哦,谢谢你的建议。我不知道。 – VansFannel 2013-04-22 10:57:13

+0

它应该是'@property(原子)ServerStatus状态;'在我之前的评论中(编辑太迟)。 – 2013-04-22 11:01:46

回答

2

我的理解是,两段代码是等同 - 为了做NSCondition@synchronized同样的事情,你会写显著更多的代码。据documentation的概述部分,setStatus实现与NSCondition应该是这个样子:

- (void)setStatus:(ServerStatus)newStatus 
{ 
    static BOOL safe_to_set_status = YES; 
    [statusLock lock]; 
    while (!safe_to_set_status) { 
     [statusLock wait]; 
    } 
    safe_to_set_status = NO; 
    status = newStatus; 
    safe_to_set_status = YES; 
    [statusLock signal]; 
    [statusLock unlock]; 
} 

如果你需要的是防止并发修改,使用@synchronized看起来像一个更简单的选择。

+0

感谢您的回答。我正在将一个Android应用程序移植到iOS,并且我在Android上找到了这个代码:'synchronized(statusLock){status = serverStatus; }'。这就是我要问的原因,因为我不确定哪个选项最适合将'synchronized'从Java移植到Objective-C。 – VansFannel 2013-04-22 10:36:10

+0

@VansFannel Objective C的'@ synchronized'与Java的'synchronized'类似。您可以使用任何对象进行同步。如果只有实例方法在特定的锁上同步,那么使用'@synchronized(self)'而不是使用'statusLock'对象是很常见的。无论如何,'statusLock'对象不需要是'NSCondition'。事实上,仅仅为了使用'@ synchronized'就创建'NSCondition'会是一种误导。 – dasblinkenlight 2013-04-22 10:46:07

+0

再次感谢。我不知道如何向你发送直接信息,所以我必须在这里问你。你能帮我解决这个问题吗? http://stackoverflow.com/questions/16104678/nscondition-wait-for-a-specified-amount-of-time谢谢。 – VansFannel 2013-04-22 11:05:16