2011-01-13 16 views
0

Ich habe ein NSDictionary, das von A LOT gelesen und an einigen Punkten gleichzeitig auf A LOT geschrieben wird.thread safe nsdictionary

Um die Sicherheit beim Iterieren zu erhöhen, kopiere ich es, wiederhole die Kopie und füge es dem Original hinzu.

Manchmal kopiert ein anderer Thread es, während es hinzugefügt wird. Gibt es einen besseren Weg, um es threadsicher zu machen?

Antwort

1

Wenn Sie Änderungen an einem NSMutableDictionary vornehmen möchten und die Vorgänge threadsicher ausgeführt werden müssen, besteht die einfachste Möglichkeit darin, alle Zugriffe auf dieses Objekt mit der @synchronized-Anweisung zu verknüpfen, die den Compiler anweist Sperre Zugriff auf das Objekt in einem Thread-sicher, ausnahmefest Mode:

@synchronized (myDictionary) { 
    [myDictionary setObject: ... forKey: ...]; 
    [myDictionary removeObjectForKey: ...]; 
} 

Es gibt leistungsfähigere Alternativen zu @synchronized, aber das sollte nur ein Problem sein, wenn Sie Ihren Code profiliert haben und sieht die Synchronisation ein Problem.

+0

Nichts über NSMutableDictionary ist threadsicher außer dem Lesen nur (dh, es genauso behandeln wie ein unveränderliches NSDictionary und Schreiben nur bei der Initialisierung). –

+0

Ah, Mist, du hast Recht. Ich hatte gedacht, dass die Unterklassen "__Mutable____" threadsicher gemacht wurden. Bearbeiten meiner Antwort. –

+0

+1 und bitte entfernen Sie die Kommentare, sie machen jetzt keinen Sinn, ohne den Bearbeitungsverlauf zu betrachten. –

0

eine von vielen Ansätzen:

eine Klasse erzeugen, die eine entsprechende Verriegelung enthält und ein Wörterbuch (genauer gesagt, verwende ich C++ Schablonen, die als Behälter dienen). Wickeln Sie dann die Schnittstelle nach Bedarf. Ich habe dies für viele CF/NS-Typen getan. Es ist ungefähr so ​​schnell, wie es vernünftig ist. da Sie sich mit Sammlungen beschäftigen, haben Sie mehrere Überlegungen (zB, wird die Sperre gehalten, während der Inhalt mutiert?)