2009-07-07 14 views

答えて

8

私はManualResetEventに慣れていませんが、based on the documentationは、the NSCondition classのように見えます。

NSConditionは全く同等ではありませんが、同様のシグナリング機能を提供します。 NSLockにお読みください。

+1

これは私が必要としていたものとまったく同じように見えます。ありがとう! – Lounges

+0

NSConditionはAutoResetEventに似ていて、ManualResetEventには似ていないようです。 – Brett

+0

この便利なサンプルをチェックしてください:http://stackoverflow.com/questions/6158397/equivalent-of-gcd-serial-dispatch-queue-in-ios-3-x/6258379#6258379 – Brett

0

ああ、それらは貧しい人の条件変数です。

あなたはNSConditionクラスを使うことができますが、私はそれが良いと思います
ソースにまっすぐ行く。 pthread_cond_initで開始してください。

あなたはそれを愛するつもりです。

+0

NSConditionは上位のラッパーですpthreadsの周り。 NSCondition/NSLockインターフェイスがジョブを実行する場合、低レベルにする必要はありません。 – Naaff

+0

さて、私はあなたが簡単な方法でそれを行うことができると思います。 –

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を使用して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 

私はちょっとした基本的なテストを行ったことがありますが、それはずっと少ない儀式で仕事を終わらせるべきだと思います。