web-dev-qa-db-ja.com

UIApplication.delegateはメインスレッドからのみ使用する必要があります

他のviewControllersでCoreDataを操作するためのショートカットとして、アプリデリゲートに次のコードがあります。

let ad = UIApplication.shared.delegate as! AppDelegate
let context = ad.persistentContainer.viewContext

ただし、次のエラーメッセージが表示されます。

「バックグラウンドスレッドから呼び出されたUI API」および「UIApplication.delegateはメインスレッドからのみ使用する必要があります」。

アプリがバックグラウンドで動作しているときにCoreDataを使用していますが、このエラーメッセージが表示されるのは今回が初めてです。誰かがここで何が起こっているのか知っていますか?

更新:appDelegateクラス自体の内部にこれを移動しようとし、次のコードを使用しました-

let dispatch = DispatchQueue.main.async {
    let ad = UIApplication.shared.delegate as! AppDelegate
    let context = ad.persistentContainer.viewContext
}

これで、AppDelegate外の広告とコンテキスト変数にアクセスできなくなりました。行方不明のものはありますか?

10
LFHS

これへの参照を使用して( -[UIApplication delegate]はメインスレッドからのみ呼び出す必要があります )Swift(クエリの解決のため)

    DispatchQueue.main.async(execute: {

      // Handle further UI related operations here....
      //let ad = UIApplication.shared.delegate as! AppDelegate
      //let context = ad.persistentContainer.viewContext   

    })

編集あり:(広告とコンテキストを宣言する適切な場所はどこですか?これらをメインのviewControllersで宣言する必要がありますディスパッチ)
変数の場所(広告とコンテキスト)宣言は、そのスコープを定義します。これらの変数のスコープを決定する必要があります。プロジェクトまたはアプリケーションレベル(グローバル)、クラスレベル、または特定のこの関数レベルを宣言できます。これらの変数を他のViewControllersで使用する場合は、グローバルまたはクラスレベルでpublic/open/internalアクセスコントロールを使用して宣言します。

   var ad: AppDelegate!    //or var ad: AppDelegate?
   var context: NSManagedObjectContext!    //or var context: NSManagedObjectContext?


   DispatchQueue.main.async(execute: {

      // Handle further UI related operations here....
      ad = UIApplication.shared.delegate as! AppDelegate
      context = ad.persistentContainer.viewContext   

      //or 

      //self.ad = UIApplication.shared.delegate as! AppDelegate
      //self.context = ad.persistentContainer.viewContext   

    })
6
Krunal