2016-04-15 8 views
1

私はAppleのGCDガイドをチェックしていましたが、達成しようとしているものについてかなり長いことがわかりました。私は(のObjective-Cを使用して)のiOS SpriteKitベースのゲームに取り組んでいると私は2つの単純なタスクの同時実行を使用する必要があります。サンプルObjective-Cスレッドセーフなコールバックを効率的にキューに入れるコード

  • 別のスレッド/キュー内のすべての初期化ロジックを実行しながら、右の打ち上げ後、プログレスバーを表示します。私は古典的なposixスレッドを使用してこれを達成する方法を知っていますが、はるかに効率的であるGCDに相当するものがありますか?
  • ユーザーの進行状況を別のスレッド/キューに定期的に保存して、UIフレームレート/応答性に影響を与えないようにします。私はGCDを使ってコールバックブロックをセカンダリスレッドの下にキューイングできますか?

どちらの場合でも、並行処理に関連するデータの破損のリスクはなく、クロススレッド通信(必要な場合は同期が必要ありません)を実行する必要はありません。

サンプルコードの回答は完璧です。

+1

プログレスバーが表示されているようにやや工夫されているサウンドはかなり簡単で、メインスレッド(SpriteKitがUIKitのようなものならば)でのみ実行でき、ユーザーの進行状況は、ストレージに書き込むことができます。私はバックグラウンドスレッド/タスク/これらの要件のために何が必要なのか分かりません。 – trojanfoe

+1

私は、ゲームがロードされている間、ユーザの進捗インジケータを更新できる一方で、バックグラウンドで実行する必要がある集中的な初期化があることを意味していると思います。 –

+0

ジョージの言葉に加えて、ゲームが始まる前に起動時に初期化コードを実行する必要があります。私のApp Delegateアプリケーションのメインスレッドに保持する:did/willFinishLaunchingWithOptions:起動時に初期化が完了するまでアプリアイコンが一瞬停止する。プログレスバーを持つセカンダリスレッドはそれを防ぎます。しかし、ユーザーの進捗状況を保存することについては、おそらく私はそこに私のデザインを考え直しているでしょう。 – ALTN

答えて

2

私はそれがはるかに効率的であることをわからないんだけど、よりよいコードになり...

システムはあなたではなくあなた自身を作成するよりも使用することができますGCDと、いくつかのデフォルトの背景のキューを提供し、それは他のスレッドにキューの負荷を軽減します。そして、それが最も有益であると考えられるときに処理します。この作業を取得するには、超簡単です:

// Dispatch a block of code to a background queue 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, { 
    // Do initialisation in the background 
    ... 
    // Call back to the main queue if you want to update any UI when you are done 
    dispatch_sync(dispatch_get_main_queue(), { 
     // Set progress indicator to complete? 
    }); 
}); 
// Handle the progress indicator while the initialisation is happening in the background 

とてもいいと単純

---- SWIFT ----

// Dispatch a block of code to a background queue 
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
dispatch_async(queue) { 
    // Do initialisation in the background 
    ... 
    // Call back to the main queue if you want to update any UI when you are done 
    dispatch_sync(dispatch_get_main_queue()) { 
     // Set progress indicator to complete? 
    } 
} 
// Handle the progress indicator while the initialisation is happening in the background 

---- OBJ-C ----これはバックグラウンドキューに初期化をディスパッチし、完了したらメインスレッドにコールバックし、続いて進行インジケータを更新します。

メインキュー以外のキューからUIを更新してはいけません。

希望があれば、私がもっと明確にできるかどうか教えてください。

+0

まさに私が探していたものです、ありがとう! – ALTN

関連する問題