2009-07-07 5 views

Antwort

8

Ich bin nicht sehr vertraut mit ManualResetEvent, aber based on the documentation, es sieht aus wie the NSCondition class könnte das sein, was Sie suchen.

NSCondition ist keineswegs eine genaue Entsprechung, aber es bietet ähnliche Signalisierungsfunktionalität. Vielleicht möchten Sie auch auf NSLock nachlesen.

+1

Lesen auf dem Dokument scheint dies genau das zu tun, was ich brauchte. Vielen Dank! – Lounges

+0

Es sieht so aus, als ob NSCondition eher AutoResetEvent und nicht ManualResetEvent ist. – Brett

+0

Schauen Sie sich dieses nützliche Beispiel an: http: //stackoverflow.com/questions/6158397/eqivalent-of-gcd-serial-dispatch-queue-in-ios-3-3/6258379#6258379 – Brett

0

Ah, das sind armen Mann Zustandsvariablen.

Sie könnten die NSCondition Klasse verwenden, aber ich denke, es ist besser
direkt an die Quelle zu gehen. Beginnen Sie mit pthread_cond_init.

Sie werden es lieben.

+0

NSCondition ist ein Wrapper auf höherer Ebene um Pthreads. Wenn die NSCondition/NSLock-Schnittstelle den Job ausführt, müssen Sie nicht auf eine untergeordnete Ebene wechseln. – Naaff

+0

Nun, ich denke, du könntest es einfach machen. –

1

Ich gebe Ihnen den Beispielcode, den ich gestern gerne gefunden hätte (aber nirgends finden konnte). Wenn Sie eine Producer/Consumer-Klasse erstellen möchten, in der der Consumer asynchron ist, müssen Sie Folgendes tun:

Sie müssen NSConditionLock deklarieren und zuordnen.

NSArray * data = [self getSomeData]; 

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

Und im Hauptcode, wenn Sie Daten hinzufügen, und Sie möchten den anderen Thread zu entsperren, müssen Sie nur noch hinzufügen:

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

Hinweis: Ich habe hier nicht beschreiben, wie Daten zwischen dem Hersteller und dem Verbraucher ausgetauscht. In meinem Programm ging es durch eine SQLite/CoreData-Datenbank, so dass die Thread-Synchronisierung auf einer höheren Ebene erfolgt. Wenn Sie jedoch ein NSMutableDictionary verwenden, müssen Sie NSLock hinzufügen.

0

Hier ist eine Wrapperklasse, die ich erstellt habe, die ManualResetEvent mit NSCondition emuliert.

Ich habe nur einige grundlegende Tests gemacht, aber ich denke, es sollte die Arbeit mit viel weniger Zeremonie erledigen.