他の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
外の広告とコンテキスト変数にアクセスできなくなりました。行方不明のものはありますか?
これへの参照を使用して( -[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
})