C#ManualResetEvent的Objective-C/Cocoa等价物
答
我对ManualResetEvent不是很熟悉,但是based on the documentation,它看起来像the NSCondition class可能是您正在寻找的。
NSCondition绝不意味着完全相同,但它的确提供了类似的信号功能。您可能还想阅读NSLock。
答
啊,那些是穷人的条件变量。
你可以使用NSCondition
类,但我认为它是更好的
直接来源。从pthread_cond_init
开始。
你会喜欢它。
答
我给你我希望昨天找到的示例代码(但无法在任何地方找到)。如果要创建消费者异步的生产者/消费者类,则需要执行以下操作:
您需要声明并分配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。
答
这是我创建的包装类,它使用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
我已经做了一些基本的测试,但我认为应该用更少的仪式完成工作。
阅读文档的这似乎是做我所需要的。谢谢! – Lounges 2009-07-07 23:19:00
它看起来像NSCondition更像是AutoResetEvent而不是ManualResetEvent。 – Brett 2013-01-25 03:50:13