Objective-C / Cocoa等价于C#ManualResetEvent

时间:2009-07-07 22:33:18

标签: objective-c cocoa multithreading

是否有可用于Objective-C / Cocoa的.NET ManualResetEvent类?

4 个答案:

答案 0 :(得分:8)

我对ManualResetEvent不是很熟悉,但是based on the documentation,看起来the NSCondition class可能就是你想要的。

NSCondition绝不是完全等效的,但它确实提供了类似的信令功能。您可能还想阅读NSLock

答案 1 :(得分:1)

我会告诉你昨天我想找到的示例代码(但在任何地方都找不到)。如果要创建消费者异步的生产者/消费者类,则需要执行以下操作:

您需要声明并分配NSConditionLock。

NSArray * data = [self getSomeData];

if ( [data count] == 0 ) {
  NSLog(@"sendThread: Waiting...");
  [_conditionLock lockWhenCondition:1];
  [_conditionLock unlockWithCondition:0];
  NSLog(@"sendThread: Back to life...");
}
else {
  // Processing
}

在主代码中,当您添加数据并想要解锁其他线程时,您只需添加:

[_conditionLock lock];
[_conditionLock unlockWithCondition:1];

注意:我这里没有描述如何在生产者和消费者之间交换数据。在我的程序中,它通过SQLite / CoreData数据库,因此线程同步在更高级别完成。但是如果使用NSMutableDictionary,则需要添加一些NSLock。

答案 2 :(得分:1)

这是我创建的包装类,它使用NSCondition模拟ManualResetEvent。

@interface WaitEvent : NSObject {
    NSCondition *_condition;
    bool _signaled;
}

- (id)initSignaled:(BOOL)signaled;
- (void)waitForSignal;
- (void)signal;

@end

@implementation WaitEvent

- (id)initSignaled:(BOOL)signaled
{
    if (self = ([super init])) {
        _condition = [[NSCondition alloc] init];
        _signaled = signaled;
    }

    return self;
}

- (void)waitForSignal
{
    [_condition lock];
    while (!_signaled) {
        [_condition wait];
    }

    [_condition unlock];
}

- (void)signal
{
    [_condition lock];
    _signaled = YES;
    [_condition signal];
    [_condition unlock];
}

@end

我已经完成了一些基本的测试,但我认为应该以更少的仪式完成工作。

答案 3 :(得分:0)

啊,那些是穷人的条件变量。

您可以使用NSCondition课程,但我认为这更好 直接去源头。从pthread_cond_init开始。

你会爱上它。