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. C#の:ManualResetEvent
- 3. カールC#に相当する
- 4. R ++に相当するC++
- 5. C++に相当する。cin.peek()
- 6. db.repairDatabase()に相当するC#
- 7. VBA:GoalSeek C#に相当する
- 8. C++、C#のEncoding.ASCII.GetBytesに相当()
- 9. Java述語に相当するC/C++
- 10. Objective-Cに相当するC#のオーバーライド
- 11. (パスカルから)C/C++に相当する
- 12. C/C++のnumpy.nan_to_numに相当します。
- 13. httplib相当のC
- 14. C#相当のAtlEscapeUrl
- 15. iif相当のC#
- 16. C#のByteBuffer.PutDouble相当
- 17. C#のJaxbに相当する
- 18. JS#RegEx式に相当するC##
- 19. Rubyのサンドイッチブロックコードに相当するC#式。
- 20. Javaリソースに相当するC#
- 21. .NETのTask.DelayのC++に相当する?
- 22. LinuxのC++でWIN32_FIND_DATAに相当する
- 23. AESのJava SecretKeySpecに相当するC#
- 24. FactoryGirl/machinistに相当するC#/ .Net
- 25. C#でJavaの "ByteBuffer.putType()"に相当する
- 26. boost :: gregorianジェネレータに相当するC#
- 27. JavaのCharacter.digitに相当するC#
- 28. C++ enumに相当するRuby/Rails
- 29. C++でのQt.createQmlObjectに相当する
- 30. imbueとnumpunctに相当するC#
これは私が必要としていたものとまったく同じように見えます。ありがとう! – Lounges
NSConditionはAutoResetEventに似ていて、ManualResetEventには似ていないようです。 – Brett
この便利なサンプルをチェックしてください:http://stackoverflow.com/questions/6158397/equivalent-of-gcd-serial-dispatch-queue-in-ios-3-x/6258379#6258379 – Brett