1

Meine Frage, ist sehr einfach, denke ich, aber ich kann keine direkten Informationen zu bestätigen oder zu verweigern.SKNode vergleichbar mit NSMutableArray, GCD, Aufzählung

Meine Frage ist:

Wenn Aufzählung durch SKNodes, sollten sie vorsichtig mit behandelt werden:

SKNode *someTreeNode; 
NSArray *someArray = [someTreeNode children]; 

     [someArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 

//blah blah 

}]; 

Wie NSMutableArray?

Wenn Sie GCD verwenden und den SKNode (someTreeNode) manipulieren, also Eltern hinzufügen und entfernen? . (Zusätzlich konnte ich Dispatch Barrieren verwendet beim Laden EinArray zu blockieren

aber alles in allem der realen niedrigste Form dieser Frage ist:

Ist SKNode Thread-sicher wie NSArray, oder ist es unsicher, wie NSMutableArray

? es ist unsicher erzählt

mir Mein Instinkt aber wie ich schon sagte, ich kann diese ...

Dank

+0

Es ist einfach. Die Frage ist: Ist das Objekt veränderlich oder unveränderlich? Selbst das Aufzählen von 'NSArray' ist nur Thread-sicher aus der Perspektive des Containers. Es gibt nichts zu verhindern, dass Objekte innerhalb des Arrays von mehreren gleichzeitigen Threads geändert werden. – Avi

+0

Nachdem ich hin und her meine Enumerationen von NSArray-Enumerationen in SKNode-Enumerationen geändert habe, stürze ich nicht ab, während ich SKNode-Enumerationen mache. Also werde ich sie an meiner Seite "sicher" nennen, wenn ich nicht wieder ein paar Abstürze bekomme, die ich noch nicht bekommen habe. Der Grund, warum ich diese Frage gestellt habe, war, dass ich mit einigen NSMutableArrays gearbeitet habe und am Wochenende in ernsthafte Aufzählungsfehler geraten bin. Ich debuggte sie und ich fing an über SKNode nachzudenken und benutzte das Kinder-Array. Jetzt habe ich sie auf Standard-Enumerationsmethoden zurückgesetzt, ohne Children Array zu verwenden, und es geht ihnen gut! – rezwits

Antwort

0

bei der Arbeit GCD (Grand Central Dispatch (n)) mit der Blockverarbeitung Anrufen nicht bestätigen oder dementieren:

[someMutableArray enumerateObjectsUsingBlock:^(id _Nonnull obj, 
            NSUInteger idx, BOOL * _Nonnull stop) { 
     //some code 
    }]; 

oder

[someTreeNode enumerateChildNodesWithName:@"*" 
            usingBlock:^(SKNode *node, BOOL *stop) { 
     //some code 
    }]; 

vorsichtig vorgehen, versuchen ein noch gar nicht zu verwenden, vor allem, wenn Geräte mit dem gleichen Verarbeitungscode verwenden und miteinander vernetzt sind solche Objekte zu teilen, über das Netzwerk überträgt. Sie werden mit Abstürzen enden. d. h., sie sind nicht threadsicher ... Wenn Sie müssen, verwenden Sie dispatch_barrier_async mit einer dispatch_sync, um den Inhalt zu bearbeiten.