1

我的問題,很簡單,我認爲,但我找不到任何直接的信息來確認或否認。SKNode媲美NSMutableArray,GCD,枚舉

我的問題是:

當枚舉通SKNodes,他們應該被小心使用治療:

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

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

//blah blah 

}]; 

喜歡的NSMutableArray?

如果您使用GCD並操作SKNode(someTreeNode),即添加和刪除父級? (另外,我可以使用派遣的障礙,同時裝載的someArray阻止

但所有的這一切問題的真正最低的形式是:

是SKNode線程安全的像NSArray的,或者是不安全喜歡的NSMutableArray

我的直覺告訴我,這是不安全的,但就像我說的,我不能確認或否認這一點......

感謝

+0

很簡單。問題是:對象是可變的還是不可變的?即使從容器的角度來看,枚舉'NSArray'也只是線程安全的。沒有什麼可以防止從多個併發線程中更改數組中的對象。 – Avi

+0

在我將枚舉從NSArray枚舉更改爲SKNode枚舉之後,我在執行SKNode枚舉時沒有崩潰。所以在我的最後,我會稱他們爲「安全」,除非我再次遇到一些崩潰事件,這些事件我還沒有得到。我問這個問題的原因是,我正在使用一些NSMutableArrays,並在週末出現了一些嚴重的枚舉錯誤。我調試了它們,並開始考慮SKNode並使用了子數組。現在我已經將它們還原爲標準的枚舉方法,而不是使用Children Array,並且它們很好! – 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_barrier_async和dispatch_sync來編輯內容。