web-dev-qa-db-ja.com

iOSでのマルチスレッド化について

OpenEarsとFliteライブラリを利用するアプリケーションがあります。問題は、Fliteライブラリがリソースを大量に消費し、アプリがフリーズすることです。私はバックグラウンドスレッドでFliteを実行すると問題が修正されると思いますが、その方法はnoです。

そうは言っても、iOSでバックグラウンドスレッドを実装するにはどうすればよいですか

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

25
Moshe

同時実行プログラミングガイド 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やその他を更新できるようにします。これはよく使われるイディオムです。

45
zoul

たぶん最善の方法は このAppleのチュートリアル です。私はそれを注意深く読み(10〜20分)、すべてのアプリケーションを「スレッド化」しました!優れた!

6

スウィフト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パラメータは「Quality of Service」を表します。バックグラウンドスレッドに優先順位を付けることを優先します。

  • .userInteractive(最高の優先度)
  • .userInitiated(数秒の余裕がある場合)
  • .utility(数秒から数分時間を空けることができる場合)
  • .background(最低の優先度-スペアする分/時間)
1
Mark Moeykens