2009-07-07 7 views

Respuesta

8

No estoy muy familiarizado con ManualResetEvent, pero based on the documentation, parece que the NSCondition class podría ser lo que estás buscando.

NSCondition no es en absoluto un equivalente exacto, pero proporciona una funcionalidad de señalización similar. También es posible que desee leer en NSLock.

+1

Al leer el documento, parece que hace exactamente lo que necesitaba. ¡Gracias! – Lounges

+0

Parece que NSCondition es más como AutoResetEvent y no ManualResetEvent. – Brett

+0

Echa un vistazo a esta muestra útil: http: //stackoverflow.com/questions/6158397/equivalent-of-gcd-serial-dispatch-queue-in-ios-3-x/6258379#6258379 – Brett

0

Ah, esas son las variables de condición del hombre pobre.

Puede usar la clase NSCondition, pero creo que es mejor
para ir directamente a la fuente. Comience con pthread_cond_init.

Te va a encantar.

+0

NSCondition es un contenedor de nivel superior alrededor de pthreads. Si la interfaz NSCondition/NSLock hace el trabajo, no es necesario ir a bajo nivel. – Naaff

+0

Bueno, supongo que podrías hacerlo de la manera más fácil. –

1

Te daré el código de muestra que me hubiera gustado encontrar ayer (pero no pude encontrar en ninguna parte). Si desea crear una clase de productor/consumidor donde el consumidor es asincrónico, esto es lo que debe hacer:

Debe declarar y asignar 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 
} 

Y en el código principal, al agregar los datos y desea desbloquear el otro hilo, sólo hay que añadir:

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

Nota: No describo aquí cómo los datos del intercambiado entre el productor y el consumidor. En mi programa, estaba pasando por una base de datos SQLite/CoreData, por lo que la sincronización de subprocesos se realiza en un nivel superior. Pero si usa un NSMutableDictionary, necesita agregar algo de NSLock.

0

Aquí hay una clase de contenedor que he creado que emula ManualResetEvent usando NSCondition.

@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 

He hecho algunas pruebas básicas, pero creo que debería hacer el trabajo con mucha menos ceremonia.