OpenEarsとFliteライブラリを利用するアプリケーションがあります。問題は、Fliteライブラリがリソースを大量に消費し、アプリがフリーズすることです。私はバックグラウンドスレッドでFliteを実行すると問題が修正されると思いますが、その方法はnoです。
そうは言っても、iOSでバックグラウンドスレッドを実装するにはどうすればよいですか?
誰かが私にいくつかのチュートリアルを紹介したり、サンプルコードを共有したり、この問題を解決するのに役立つ一般的なアドバイスをいただければ幸いです。
同時実行プログラミングガイド by Appleは素晴らしい読み物です。並行プログラミングは、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やその他を更新できるようにします。これはよく使われるイディオムです。
たぶん最善の方法は このAppleのチュートリアル です。私はそれを注意深く読み(10〜20分)、すべてのアプリケーションを「スレッド化」しました!優れた!
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
パラメータは「Quality of Service」を表します。バックグラウンドスレッドに優先順位を付けることを優先します。
.userInteractive
(最高の優先度).userInitiated
(数秒の余裕がある場合).utility
(数秒から数分時間を空けることができる場合).background
(最低の優先度-スペアする分/時間)