アップルのConcurrency Programming Guideは素晴らしい読書です。並行プログラミングは、Webからサンプルコードをコピーして、あなたが満足するまでハッキングすることで、拾い読みしたいことではありません。トラブルから身を守るための選択肢と原則を知っておくとよいでしょう。
しばらくして答えを見直すと、今日ではGrand Central Dispatchを使ってほとんど間違っていることはありません。バックグラウンドでタスクを実行すると、次のようになります。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self doSomeLongTask]; // 1
dispatch_async(dispatch_get_main_queue(), ^{
[self longTaskDidFinish]; // 2
});
});
長いタスク(1)は、いくつかのバックグラウンドスレッドで実行され、私はすなわち、の認識しています何のキャッチはありません。そのスレッドにはすでにオートリリースプールがあります。ループ実行などに気を付ける必要はありません。タスクが完了した後、コードは-longTaskDidFinish
(メインスレッド(2))にコールされるため、UIなどの更新が可能です。これはよく使われるイディオムです。
あなたは、キューまたはスレッドを通じてOpenEars' FLITEライブラリを合理化することができましたか? – Rasman
@Rasman - 私は正直言って、本当に忙しかった。私は別のプロジェクトでマルチスレッドに取り組んでいるので、すぐにこれを再訪するかもしれません。 – Moshe
フォローアップとして、私はディスパッチキューを使って自分のアプリを構築するだけです。今はうまくいくようです。それは実際にはすべて私が期待していたより簡単だった... – Rasman