Objective-C/Cocoaで使用できる.NET ManualResetEventクラスがありますか?Objective-C/Cocoaに相当するC#ManualResetEvent
答えて
私はManualResetEventに慣れていませんが、based on the documentationは、the NSCondition classのように見えます。
NSConditionは全く同等ではありませんが、同様のシグナリング機能を提供します。 NSLockにお読みください。
ああ、それらは貧しい人の条件変数です。
あなたはNSCondition
クラスを使うことができますが、私はそれが良いと思います
ソースにまっすぐ行く。 pthread_cond_init
で開始してください。
あなたはそれを愛するつもりです。
NSConditionは上位のラッパーですpthreadsの周り。 NSCondition/NSLockインターフェイスがジョブを実行する場合、低レベルにする必要はありません。 – Naaff
さて、私はあなたが簡単な方法でそれを行うことができると思います。 –
私は昨日見つけたかっただろうが(どこでも見つけることができなかった)サンプルコードを提供します。コンシューマが非同期のプロデューサ/コンシューマクラスを作成する場合は、これを行う必要があります。
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
私はちょっとした基本的なテストを行ったことがありますが、それはずっと少ない儀式で仕事を終わらせるべきだと思います。
- 1. ManualResetEventに相当するBoost?
- 2. VBA:GoalSeek C#に相当する
- 3. db.repairDatabase()に相当するC#
- 4. C++に相当する。cin.peek()
- 5. C#の:ManualResetEvent
- 6. (パスカルから)C/C++に相当する
- 7. Objective-Cに相当するC#のオーバーライド
- 8. JavaのThread.setDefaultUncaughtExceptionHandler()に相当するC#?
- 9. C++でJavaのIllegalArgumentExceptionに相当する
- 10. C#でJavaの "ByteBuffer.putType()"に相当する
- 11. C#のJavaマップに相当する
- 12. C++ JavaのBlockingQueueに相当する
- 13. Javaに相当するC++ this
- 14. PHP time()に相当するC#.NET
- 15. FactoryGirl/machinistに相当するC#/ .Net
- 16. Objective-Cに相当するJavaのBlockingQueue?
- 17. C#string.IsNullOrEmptyメソッドに相当するPHP?
- 18. Objective-Cに相当するJavaのInteger.toOctalString()?
- 19. .NETのTask.DelayのC++に相当する?
- 20. Objective-Cの@ "string"に相当するPHP
- 21. C++ Armadillo:Matlabのbsxfunに相当する
- 22. Rubyシンボルに相当するObjective-C
- 23. JS#RegEx式に相当するC##
- 24. Javaに相当するC#Array.GetLength(i)
- 25. Javaリソースに相当するC#
- 26. C#VB 6 DoEventsに相当する
- 27. Form.Activateイベントに相当するC#?
- 28. Rubyのサンドイッチブロックコードに相当するC#式。
- 29. Pythonに相当するC#の.Select?
- 30. Javaに相当するcin(C++)
これは私が必要としていたものとまったく同じように見えます。ありがとう! – Lounges
NSConditionはAutoResetEventに似ていて、ManualResetEventには似ていないようです。 – Brett
この便利なサンプルをチェックしてください:http://stackoverflow.com/questions/6158397/equivalent-of-gcd-serial-dispatch-queue-in-ios-3-x/6258379#6258379 – Brett