2
1

More than 1 year has passed since last update.

【Swift】バックグラウンドスレッドからの変更はできないらしい

Posted at

はじめに

上記のリンクを参考にインターネット接続の監視を実装してる際にViewの切り替え時に紫色警告が発生したので対処法を載せておきます。

実装内容

// ネットワーク監視
private func observeNetwork() {
    monitor.pathUpdateHandler = { path in
        if path.status == .satisfied {
            self.isNetwork = true // オンライン
        } else {
            self.isNetwork = false // オフライン
        }
    }
    monitor.start(queue: queue)
}
import SwiftUI

@main
struct TwitterSearchApp: App {
    @ObservedObject private var appViewModel = AppViewModel()
    var body: some Scene {
        WindowGroup {
            if !appViewModel.isNetwork {
                OfflineView()
            } else {
                HomeView()
            }
        }
    }
}

警告文

Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

スクリーンショット 2022-08-13 23.37.55.png

DeepL翻訳によるとこんな事を言ってるらしいです。

バックグラウンドスレッドからの変更の発行は許可されていません。モデルの更新時には、必ずメインスレッドから (receive(on:) のような演算子を使って) 値を発行するようにしてください。

解決方法

DispatchQueue.main.asyncで囲う事によって解決しました。

// ネットワーク監視
private func observeNetwork() {
    monitor.pathUpdateHandler = { path in
        if path.status == .satisfied {
            DispatchQueue.main.async {
                self.isNetwork = true // オンライン
            }
        } else {
            DispatchQueue.main.async {
                self.isNetwork = false // オフライン
            }
        }
    }
    monitor.start(queue: queue)
}

おわり

紫色警告はレアです

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1