Ios SKNode可与NSMutableArray、GCD、枚举相比较
我的问题很简单,但我找不到任何直接的信息来证实或否认 我的问题是: 当通过SKNodes进行枚举时,是否应使用以下方法对其进行精细处理:Ios SKNode可与NSMutableArray、GCD、枚举相比较,ios,objective-c,nsmutablearray,grand-central-dispatch,sknode,Ios,Objective C,Nsmutablearray,Grand Central Dispatch,Sknode,我的问题很简单,但我找不到任何直接的信息来证实或否认 我的问题是: 当通过SKNodes进行枚举时,是否应使用以下方法对其进行精细处理: SKNode *someTreeNode; NSArray *someArray = [someTreeNode children]; [someArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { //bla
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一样不安全
我的直觉告诉我这是不安全的,但就像我说的,我不能证实或否认这一点
感谢您在使用GCD(Grand Central Dispatch(es))和块处理呼叫时:
[someMutableArray enumerateObjectsUsingBlock:^(id _Nonnull obj,
NSUInteger idx, BOOL * _Nonnull stop) {
//some code
}];
或
小心,甚至尽量不要使用,特别是如果使用使用相同处理代码的设备,并通过网络传输将这些对象连接在一起共享。最终会导致崩溃。也就是说,它们不是线程安全的…如果必须,请使用dispatch\u barrier\u async和dispatch\u sync编辑内容。使用GCD时(中央大调度)与区块处理呼叫:
[someMutableArray enumerateObjectsUsingBlock:^(id _Nonnull obj,
NSUInteger idx, BOOL * _Nonnull stop) {
//some code
}];
或
小心,甚至尽量不要使用,特别是如果使用使用相同处理代码的设备,并通过网络传输将这些对象连接在一起共享。最终会导致崩溃。也就是说,它们不是线程安全的…如果必须,请使用dispatch\u barrier\u async和dispatch\u sync来编辑内容。这很简单问题是:对象是可变的还是不可变的?从容器的角度来看,即使枚举
NSArray
也是线程安全的。没有什么可以阻止数组中的对象从多个并发线程更改。在来回将我的枚举从NSArray枚举更改为SKNode枚举之后s、 我在执行SKNode枚举时没有崩溃。因此,在我这方面,我将称之为“安全”除非我再次遇到一些崩溃,我还没有遇到。我问这个问题的原因是,我正在使用一些NSMutableArray,在周末遇到了一些严重的枚举错误。我调试了它们,开始考虑SKNode并使用子数组。现在我已将它们恢复为标准枚举hods,不使用子数组,它们很好!很简单。问题是:对象是可变的还是不可变的?即使是枚举NSArray
,从容器的角度来看也是线程安全的。没有什么可以阻止数组中的对象从多个并发线程更改。在来回将我的枚举从NSArray枚举更改为SKNode枚举,我在执行SKNode枚举时不会发生崩溃。因此,我将称它们为“安全”除非我再次遇到一些崩溃,我还没有遇到。我问这个问题的原因是,我正在使用一些NSMutableArray,在周末遇到了一些严重的枚举错误。我调试了它们,开始考虑SKNode并使用子数组。现在我已将它们恢复为标准枚举霍兹,不使用儿童阵列,他们很好!