Objective-C/Cocoa中与C# ManualResetEvent等价的内容。

11

在Objective-C/Cocoa中,是否有类似于.NET ManualResetEvent类的等效物可用?

4个回答

8

我对ManualResetEvent不是很熟悉,但根据文档的描述,似乎NSCondition类可能是您要寻找的。

NSCondition并不是完全等同的替代品,但它提供了类似的信号功能。您可能还想了解一下NSLock


1
阅读文档后,这似乎正是我所需要的。谢谢! - Lounges
看起来 NSCondition 更像是 AutoResetEvent 而不是 ManualResetEvent。 - Brett
请查看这个有用的示例:https://dev59.com/EW025IYBdhLWcg3wNC51#6258379 - Brett

2

我创建了一个包装类,使用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

我只做了一些基本测试,但我认为它应该能够以更少的仪式完成工作。


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。

0
啊,那些是穷人版的条件变量。
你可以使用 NSCondition 类,但我认为更好的做法是直接
从源头开始。从 pthread_cond_init 开始。
你会爱上它的。

NSCondition是对pthread的高级封装。如果NSCondition/NSLock接口能够胜任,就没有必要降到低级别。 - Naaff
好吧,我猜你“可以”用简单的方法来做。 - Rhythmic Fistman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接