是否有可用于Objective-C / Cocoa的.NET ManualResetEvent类?
答案 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
开始。
你会爱上它。