web-dev-qa-db-ja.com

Swift 4、メインスレッドのみの警告から使用する必要があります

Swift4in Xcode 9を使用すると、

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

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

バックグラウンドスレッドグループから呼び出されるUI API

紫色の警告。

私のコード;

var appDelegate = UIApplication.shared.delegate as! AppDelegate
public var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let prefs:UserDefaults = UserDefaults.standard
var deviceUUID = UIDevice.current.identifierForVendor!.uuidString

警告行は

  public var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

このような別の警告。

 let parameters = [
                        "tel": "\(self.phone.text!)"
                        ] as [String : String]

与える

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

再び同じエラー。

どうすれば修正できますか?何か案が ?

25
SwiftDeveloper

バックグラウンドキューでこの呼び出しを行っています。修正するには、次のようなものを試してください...

public var context: NSManagedObjectContext

DispatchQueue.main.async {

    var appDelegate = UIApplication.shared.delegate as! AppDelegate
    context = appDelegate.persistentContainer.viewContext        
}

これはこれを行うにはかなり悪い方法ですが...あなたはあなたのApp Delegateをグローバル変数として使用しています(私たちは皆それが悪いことを知っています!)

View ControllerからView Controllerに管理対象オブジェクトのコンテキストを渡すことを検討する必要があります…

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: 

    (window?.rootViewController as? MyViewController)?.moc = persistentContainer.viewContext
}

等々

54
Ashley Mills