1

私の質問は非常に単純だと思いますが、確認や拒否のための直接情報は見つかりません。NSMutableArray、GCD、列挙型に匹敵するSKNode

私の質問は:

SKNodesスルー列挙は、彼らが使用して繊細に扱われるべきである時:

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

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

//blah blah 

}]; 

をNSMutableArrayの気に入りましたか?

GCDを使用していて、SKNode(someTreeNode)を操作している、つまり親を追加および削除している場合は、 (someArrayのロード中に加えて、私はブロックするようにディスパッチ障壁を使用することができ

をしかし、この質問の全てのすべての実最低の形式は次のとおりです。

はNSArrayのような安全なSKNodeスレッドである、またはそれはNSMutableArrayのような安全でない

? 私の本能が、それは安全ではないのですが、私が言ったように私が確認したり、これを否定することはできませんと言われます

...

おかげブロック処理呼び出しで

+0

これは簡単です。問題は、オブジェクトが変更可能か不変かということです。 NSArrayを列挙しても、コンテナの観点からはスレッドセーフです。配列内のオブジェクトが複数の同時スレッドから変更されるのを防ぐことは何もありません。 – Avi

+0

NSArray列挙からSKNode列挙への列挙を前後に変更した後、SKNode列挙中にクラッシュすることはありません。だから私の終わりには、私がまだ得られていないいくつかのクラッシュに再び入らない限り、それらを「安全」と呼ぶつもりです。私がこの質問をした理由は、NSMutableArraysで作業していて、週末にいくつかの深刻な列挙エラーが発生したためです。私はそれらをデバッグし、私はSKNodeについて考え始め、子配列を使用しました。今度は、それらを子配列を使用しない標準の列挙メソッドに戻しました。それらはうまくいきます! – rezwits

答えて

0

使用して、GCD(グランドセントラル派遣(ES)):

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

又は

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

使用注意、さらにネットワーク転送を介して、そのようなオブジェクトを共有一緒に同じ処理コードを使用して、ネットワークデバイスを使用している場合は特に、まったく使用しないようにしよう。あなたはクラッシュで終わるでしょう。つまり、スレッドセーフではありません。必要な場合は、dispatch_syncを使用してdispatch_barrier_asyncを使用して内容を編集します。

関連する問題