Array wird beim Lesen geändert, nicht aufgezählt

Wenn ich zwei verschiedene Threads über GCD auf einen habeNSMutableArray und einer erstellt lediglich ein neues Array basierend auf dem veränderlichen Array, während der andere Thread Datensätze aus dem Array löscht. Sollte ich damit rechnen, dass dies ein Problem ist? Das heißt, sollte die Kopie, von der ich annehme, dass sie nur das Array "liest", nur das bekommen, was gerade im Array ist? Ich zähle das Array in keinem der Threads auf, aber es stürzt immer noch ab. Sobald ich die Lese-Routine entferne, funktioniert es einwandfrei.

Hier ist das "Lesen":

  dispatch_async(saveQueue, ^{

    NSDictionary*tempstocks=[NSDictionary dictionaryWithDictionary:self.data];

Es stürzt in diesem Thread ab mit:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[9]'

Folgendes passiert in einem anderen Thread:

[self.data removeObjectForKey:item];

Ich weiß, dass Sie beim Aufzählen nicht mutieren können, aber ich denke, es wäre in Ordnung, beim Mutieren zu lesen. Sie wissen möglicherweise nicht, welche Version des mutierten Objekts Sie erhalten, aber ich würde nicht denken, dass dies ein Problem ist, aber es ist eindeutig . Vielleicht derdictionaryWithDictionary Methode führt eine Operation durch, die zuerst X-Objekte erkennt, aber zum Zeitpunkt der Ausführung der Routine X-Y-Objekte enthält, sodass nicht das gesamte Objekt "erfasst" wirdself.data Wörterbuch in einem Klick, wenn es ausgeführt wirddictionaryWithDictionary und zählt stattdessen überself.data Was wäre im Wesentlichen das gleiche Problem wie eine Mutation während der Aufzählung?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage