我正在使用最新的SDK开发iOS 5.0+应用程序。
我有这段代码:
@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 :(得分:2)
我的理解是这两段代码不等价 - 为了与NSCondition
和@synchronized
做同样的事情,你必须写得很明显更多代码。根据{{3}}的概述部分,使用setStatus
的{{1}}实施应该如下所示:
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];
}
看起来就像一个更简单的选项。