2013-04-22 89 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