2010-12-05 3 views
24

私はOpenEarsとFliteライブラリを利用するアプリケーションを持っています。問題は、Fliteライブラリがリソースを大量に消費し、アプリケーションがフリーズすることです。私はバックグラウンドスレッドでFliteを実行すると問題が解決すると思われますが、私はを持っていません。という考え方をしています。iOSでのマルチスレッドに関するヘルプ?

、請求、はどのように私は、iOSでバックグラウンドスレッドを実装していますか?

誰かがチュートリアルやサンプルコードを共有したり、この問題の解決に役立つ一般的なアドバイスを教えていただければ幸いです。

+0

あなたは、キューまたはスレッドを通じてOpenEars' FLITEライブラリを合理化することができましたか? – Rasman

+0

@Rasman - 私は正直言って、本当に忙しかった。私は別のプロジェクトでマルチスレッドに取り組んでいるので、すぐにこれを再訪するかもしれません。 – Moshe

+0

フォローアップとして、私はディスパッチキューを使って自分のアプリを構築するだけです。今はうまくいくようです。それは実際にはすべて私が期待していたより簡単だった... – Rasman

答えて

45

アップルの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などの更新が可能です。これはよく使われるイディオムです。

+0

どのようなZoulは言った;糸通しは困難です。実行時にコードが動作しているように見えても、それでもなお非常に間違っている可能性があります。 – bbum

+0

どうすれば私のメソッドdoSOmeLongTaskからこのスレッドを取得できますか? たとえば、あなたが投稿したようです。 と私のメソッドの中で "doSomeLongTask"私はこのスレッドの最後にいくつかのものを行う必要があります – Shial

+0

'[self.longTaskDidFinish]'には何が入りますか? 'doSomeLongTask'の最後の私のアプリでは、ボタンを押すことができることを示す変数を変更します。私は '[self doSomeLongTask]'を実行した直後に '[self longTaskDidFinish]'の変数を変更するのではなく、 – Roymunson

6

おそらく最も良いことはthis tutorial from Appleです。私は注意深く(10〜20分)それを読んで、すべてのアプリケーションを「スレッド化」しました!優れた!

0

スウィフト3

DispatchQueue.global(qos: .userInteractive).async { 
    // Code to run on background thread 

    // Switch to the main UI thread to display any results needed 
    DispatchQueue.main.async { 
     // Run code on main UI thread here 
    } 
} 

qosパラメータは、 "サービスの質" の略です。あなたのバックグラウンドスレッドを与えるために、優先度のようなものだと考え:

  • .userInteractive(最優先)
  • .userInitiated(あなたは数秒を惜しまことができるとき)
  • .utility(あなたは数に数秒を惜しまことができるとき分)
  • .background(最低の優先順位 - 余裕分/時間)
関連する問題