So entfernen Sie Elemente in NSMutableArray oder NSMutableDictionary während der enumeration?
Ich bin mit block-basierten enumeration-ähnlich wie der folgende code:
[[[rows objectForKey:self.company.coaTypeCode] objectForKey:statementType]
enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id coaItem, NSUInteger idx, BOOL *stop) {
//block code here
}]
Möchte ich entfernen Sie einige Objekte, die während der enumeration-Prozess abhängig von der Objekt-Werte.
Wie könnte ich dies tun? Ich weiß, dass die Manipulation ein mutable-array oder dictionary (NSMutableArray oder NSMutableDictionary) während der enumeration ist in der Regel nicht möglich.
Was wäre die beste Möglichkeit dies umzusetzen?
Danke!
InformationsquelleAutor AlexR | 2012-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da kann man nicht entfernen von Objekten aus einer array-oder dictionary-während der enumeration, die Sie haben zu sammeln die Elemente, die Sie löschen möchten, und klicken Sie dann löschen Sie alle nach der enumeration.
Wenn Sie ' re Umgang mit einem array, können Sie nur häufen sich die indices.:
Da die Reihenfolge der Schlüssel in einem NSDictionary nicht definiert ist, für ein NSMutableDictionary müssen Sie sammeln Schlüssel statt:
Es ist die gleiche Sache, wenn man die Aufzählung mit einem block. Deklarieren Sie den Zähler in der gleichen Gültigkeitsbereich, in dem Sie erklären den block und es wird bewahrt werden, und nur funktionieren.
Außerdem lohnt ein Blick auf diese Frage von vor 3 Jahren: Beste Weg, um entfernen von NSMutableArray während der Iteration?.
InformationsquelleAutor yuji
Ob Sie, erstellen Sie einen index festlegen, während der enumeration, oder ändern Sie das array selbst während der enumeration, die Sie aufgeben müssen, um
NSEnumerationConcurrent
, weil die meisten Cocoa-Objekte können nicht sicher geändert werden, die gleichzeitig von mehreren threads.Jedenfalls die einfachste (aber vielleicht nicht die effizienteste) Ansatz ist, um Sie nur aufzuzählen, ein kopieren des Containers.
Für ein array verwenden, können Sie aufzählen, eine Kopie in umgekehrter. Ich gehe davon aus, dass wie jedes Element aufgelistet werden, können Sie beschließen, entfernen Sie das Element, nicht aber andere Elemente vorher aufgezählt oder noch aufgezählt werden.
Haben Sie zum auflisten der array in umgekehrter um zu vermeiden, ändern die noch nicht aufgezählt Teil der Reihe.
Für ein Wörterbuch, können Sie nur auflisten, eine Kopie ohne Besondere Optionen:
InformationsquelleAutor rob mayoff
Anderen option, bei einem array ist die Verwendung einer konventionellen
for
Schleife, die das arraycount
als der Grenzwert. Dann muss man bewusst sein, ob ein element entfernt wird, ein Ort<=
den index (in dem Fall sollte der index dekrementiert) oder>
als der index (in diesem Fall der index Links unverändert, andere als diefor
Anweisung Inkrement).Für ein Wörterbuch, können Sie zuerst erstellen Sie ein array mit
allKeys
, und dann das array Durchlaufen. In diesem Fall wird kein hantieren mit index-Werten erforderlich ist.InformationsquelleAutor Hot Licks