2016-05-24 15 views
1

私はSwiftで作っているiOSゲームで、userDataのプロパティーをSKNodeで読んでいて、シーンの一部である他のSKSpriteNodeのテクスチャープロパティを更新していますが、ユーザーインタラクション、私はメインキュー上でこの更新コードを非同期的にディスパッチする、それは良い考えですか?SKNodeスレッドは安全ですか?

ところで、スレッドセーフに関するいくつかの一般的な質問:データを書き込んでいるときだけ危険性がありますか、データを読み込む際にリスクがありますか?

ありがとうございます。現在documentation on SKNodeとして

+1

メインキューにディスパッチしている場合、他のすべてがメインキューで実行されているためスレッドが発生していませんが、発生している唯一のイベントは、コード – Knight0fDragon

+0

@ Knight0fDragonなぜ非同期にディスパッチしているときにマルチスレッドが起こっていないのですか? –

+1

同じスレッドでディスパッチするため、メインスレッドでコードを実行していて、同じスレッドにディスパッチしても、1つのスレッドで作業しています。マルチスレッドでは、2つ以上を使用する必要があります。また、私は今これを見ることができませんが、私はあなたがメインスレッドにすべてを残したいと思っていて、spritekitがその要素ですべてのスレッドの問題を処理できるようにしています – Knight0fDragon

答えて

0

は言う:ノードへ

操作は、メインスレッドで実行する必要があります。

だから、タイトル

における質問に対する答えが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()を使用します。

関連する問題