在Objective-C/Cocoa中,是否有类似于.NET ManualResetEvent类的等效物可用?
在Objective-C/Cocoa中,是否有类似于.NET ManualResetEvent类的等效物可用?
我对ManualResetEvent不是很熟悉,但根据文档的描述,似乎NSCondition类可能是您要寻找的。
NSCondition并不是完全等同的替代品,但它提供了类似的信号功能。您可能还想了解一下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
我只做了一些基本测试,但我认为它应该能够以更少的仪式完成工作。
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];