2009-07-07 18 views

cevap

8

ManualResetEvent ile çok aşina değilim ama based on the documentation, aradığınız şey the NSCondition class gibi görünüyor olabilir.

NSKondition hiçbir şekilde tam bir eşdeğer değildir, ancak benzer sinyal işlevselliği sağlar. Ayrıca NSLock'da da okumak isteyebilirsiniz.

+1

Dokümanları okumak, tam olarak ihtiyacım olan şeyi yapıyor gibi görünüyor. Teşekkürler! – Lounges

+0

NSCondition, AutoResetEvent ve ManualResetEvent gibi değil gibi görünüyor. – Brett

+0

Bu kullanışlı örneği inceleyin: http: //stackoverflow.com/questions/6158397/equivalent-of-gcd-serial-dispatch-queue-in-ios-3-x/6258379#6258379 – Brett

0

Ah, bunlar fakir insanın durum değişkenleridir.

Sen NSCondition sınıfını kullanabilirsiniz ama bunun kaynağına inmeye için
daha iyi olduğunu düşünüyorum. pthread_cond_init ile başlayın.

Bunu seveceksiniz.

+0

NSCondition üst düzey bir sarıcıdır pthreads etrafında. NSCondition/NSLock arayüzü işi yaparsa, düşük seviyeye gitmeye gerek yoktur. – Naaff

+0

Evet, sanırım bunu kolay yoldan yapabilirsiniz. –

1

Size dün bulmak istediğim örnek kodu vereceğim (ama hiçbir yerde bulamadım). Tüketicinin eşzamansız olduğu bir üretici/tüketici sınıfı oluşturmak istiyorsanız, yapmanız gereken şey şu:

NSConditionLock ürününü bildirmeniz ve ayırmanız gerekir.

[_conditionLock lock]; 
[_conditionLock unlockWithCondition:1]; 

Not: Eğer veri eklemek ve diğer iplik kilidini istediğinizde

NSArray * data = [self getSomeData]; 

if ([data count] == 0) { 
    NSLog(@"sendThread: Waiting..."); 
    [_conditionLock lockWhenCondition:1]; 
    [_conditionLock unlockWithCondition:0]; 
    NSLog(@"sendThread: Back to life..."); 
} 
else { 
    // Processing 
} 

Ve ana kod

, sadece eklemek zorunda Veri ne kadar burada tarif yok Üretici ve tüketici arasında değiş tokuş edildi. Programımda bir SQLite/CoreData veri tabanından geçiyordu, bu yüzden iş parçacığı senkronizasyonu daha yüksek bir seviyede gerçekleştiriliyor. Ancak bir NSMutableDictionary kullanırsanız, bazı NSLock eklemeniz gerekir.

0

Burada, ManualResetEvent öğesini NSCondition kullanarak öykünen oluşturduğum bir sarmalayıcı sınıfı var.

@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 

Sadece bazı temel sınamalar yaptım, ancak işin daha az törenle yapılması gerektiğini düşünüyorum.