1

Мой вопрос, очень простой, я думаю, но я не могу найти прямую информацию, чтобы подтвердить или опровергнуть.SKNode, сравнимый с NSMutableArray, GCD, перечисление

Мой вопрос:

Когда перечисление через SKNodes, они должны быть обработаны деликатно использованием:

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

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

//blah blah 

}]; 

Like NSMutableArray?

Если вы используете GCD и управляете SKNode (someTreeNode), то есть добавляете и удаляете родителя? . (Кроме того, я мог бы использовать диспетчерских барьеры для блокирования во время загрузки SomeArray

Но в целом реальный низшая форма этого вопроса:

Является SKNode поточно как NSArray, или это небезопасно, как NSMutableArray

?

Мой инстинкт подсказывает мне, что это небезопасно, но, как я сказал, что я не могу подтвердить или опровергнуть это ...

Благодаря

+0

Это просто. Вопрос в том, является ли объект изменчивым или неизменным? Даже перечисление «NSArray» является только потокобезопасным с точки зрения контейнера. Нет ничего, что помешало бы объектам в массиве быть из нескольких параллельных потоков. – Avi

+0

После того, как я перебирал перечисления NSArray в перечисления SKNode, у меня нет сбоев при выполнении перечислений SKNode. Поэтому в конце концов я назову их «безопасными», если я снова не смогу попасть в некоторые аварии, которых я еще не получил. Причина, по которой я задавала этот вопрос, заключалась в том, что я работал с некоторыми NSMutableArrays и в прошлые выходные попал в серьезные ошибки перечисления. Я отлаживал их, и я начал думать о SKNode и использовал дочерний массив. Теперь я вернул их к стандартным методам перечисления, не используя Children Array, и они в порядке! – rezwits

ответ

0

при использовании, НОД (Grand Central Dispatch (а)) с вызовами обработки блока:

[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 для редактирования содержимого.