環境
Xcode12.x
macOS Big Sur
質問内容
AppDelegateクラス、特にapplication(_:UIApplication, didFinishLaunchingWithOptions:[UIApplication.LaunchOptionsKey: Any?])
は、必ずメインスレッドで呼ばれるのでしょうか。
このメソッドが呼び出されるのはアプリが起動した時ですが、アプリが起動するタイミングにも色々あるかと思います。
- プッシュ通知受信時にアプリ画面を表示させることなく起動
- バックグラウンド位置情報取得時にアプリ画面を表示させることなく起動
これらの場合にも、必ずメインスレッドで呼ばれるという記述を見つけられていないため、ご存知の方がいらっしゃいましたらソースも一緒にご提示いただければ幸いです。
AppDelegateが読まれるのはViewControllerが読まれる前なので、「メインスレッドで呼ばれるのでしょうか」かを知る必要があるのでしょうか?
ソースは https://developer.apple.com/documentation/uikit の
Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated.
じゃ駄目でしょうか。なお、アプリがバックグラウンドでも、メインスレッドはメインスレッドです。
> tomato879241さん
ご返信ありがとうございます。
はい。アプリが停止状態でプッシュ通知受信時に、メインスレッドで呼び出す必要のあるライブラリ呼び出しがあります。また、そのライブラリ呼び出しに後続するかたちで実行する必要のあるメソッドがあります。
もちろん、全部一緒にDispatchQueue.main.async{ ... } で囲ってあげるとか、ライブラリ呼び出しだけ囲って、DispatchSemaphoreで直列処理するようにすることはできます。しかし、それをする必要がないならやるべきじゃないな、と思い質問させていただきました。
> hoshi-takanoriさん
提示していただいた記事がこの質問の発端でもあります。
アプリ開発者にはメインスレッドで呼び出せよ、と書かれているが、じゃあアプリ開発者の範疇外からの呼び出しも常にメインスレッドで行われるのか?という疑問です。
ただ、そうでなければ呼び出し時点でクラッシュするはずなのでありえない、と考えて問題なさそうですね。
ありがとうございます。頭の中が整理できました。
回答1件
あなたの回答
tips
プレビュー