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?