は言う:ノードへ
操作は、メインスレッドで実行する必要があります。
だから、タイトル
における質問に対する答えがSKNodeスレッドは安全ですか?
は、 - である。 SKNode
はスレッドセーフではないため、メインスレッドのみから変更する必要があります。
しかし、2番目の質問についての回答:私はメインキューに非同期にこの更新コードを派遣
、それは良いアイデアですか?
は、YESとなります。それはまさにあなたがやろうとしていたものです。
最後の質問は、データを読み取るときにリスクが発生することです。 let version = 3
のような定数を読んでも、リスクはありません。しかし、この例を見てみましょう:
var bigLazyObject: BigObject?
func getBigLazyObject() -> BigObject {
if let existingObject = bigLazyObject {
return existingObject
} else {
let newObject = BigObject()
bigLazyObject = newObject
return newObject
}
}
それはgetBigLazyObject()
は、同時に2つのスレッドで呼び出される場合occure可能な第2 BigObject
インスタンスの不要な作成を、示しています。 bigLazyObject
が実際に作成される前に、両方のスレッドがif
ステートメントのelse
ブランチに入る可能性があります。この種の問題は、スレッドセーフなシングルトンを作成する際に解決する必要があります。 Swiftでは、スレッドセーフな購入のデフォルトですが、Objective-Cでは通常ブロックdispatch_once()
を使用します。
メインキューにディスパッチしている場合、他のすべてがメインキューで実行されているためスレッドが発生していませんが、発生している唯一のイベントは、コード – Knight0fDragon
@ Knight0fDragonなぜ非同期にディスパッチしているときにマルチスレッドが起こっていないのですか? –
同じスレッドでディスパッチするため、メインスレッドでコードを実行していて、同じスレッドにディスパッチしても、1つのスレッドで作業しています。マルチスレッドでは、2つ以上を使用する必要があります。また、私は今これを見ることができませんが、私はあなたがメインスレッドにすべてを残したいと思っていて、spritekitがその要素ですべてのスレッドの問題を処理できるようにしています – Knight0fDragon