Swift の dispatchPrecondition
#Swift の dispatchPrecondition を使うことで、コードを実行している DispatchQueue の保証をすることが可能です。 条件に反した場合はエラーになってくれます (fatalError と同じ)。
サンプルコード
メインキューにいることを保証する
code:swift
dispatchPrecondition(condition: .onQueue(DispatchQueue.main))
メインキューにいないことを保証する
code:swift
dispatchPrecondition(condition: .notOnQueue(DispatchQueue.main))
特定の DispatchQueue 下にいることを保証する
サンプルでは APIRequestCallback.dispatchQueue にいることを保証しています。
code:swift
dispatchPrecondition(condition: .onQueue(APIRequestCallback.dispatchQueue))
利用について
メインキュー (メインスレッド) であることを要求するのは UI 操作です。
メインキューの保証・変換は UI 層で行なうと良いでしょう。
ここで言う UI 層は、UIKit の ViewController や SwiftUI の View を指します。
またユーザー操作を起点にしたメソッド呼出はメインキューを想定して良いでしょう。
ここでいうメソッド呼出は、ViewModel や ApplicationService のメソッド呼出を含めて指します。
自身の DispatchQueue が上記原則に反する形になっていることを、コードを読んでいる人に伝えるのに dispatchPrecondition は有効と考えています。
例えば、API のコールバックは APIRequestCallback.dispatchQueue にいるはずだけど、コールバックの途中でトースト等を表示するために DispatchQueue.main にアクセスしてしまっているとします。そこで更に UI アクセスが必要なケースではもう DispatchQueue.main.async をする必要はありません。なので DispatchQueue.main.async を呼ばないコードを書いてしまいますが、初めてコードを読む人は前のコードでメインキューに入っていることを知らないので、非メインキューで UI アクセスしているように思い、コードを遡って読む羽目になります。そこで、dispatchPrecondition を置いて、このコードはメインキューにいることを宣言するように使っています。