web-dev-qa-db-fra.com

Swift 4, doit être utilisé à partir du thread principal uniquement

Quand j'utilise Swift4dans Xcode 9 Donne moi

UIApplication.delegate doit être utilisé à partir du thread principal uniquement.

.... doit être utilisé à partir du fil principal uniquement

API d'interface utilisateur appelée à partir du groupe de threads en arrière-plan

Avertissement violet.

Mes codes;

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

La ligne d'avertissement est;

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

Un autre avertissement comme celui-ci;

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

Donne

UITextField.text doit être utilisé à partir du thread principal uniquement.

Même erreur encore ..

Comment puis-je le réparer? Une idée ?

25
SwiftDeveloper

Vous passez cet appel dans une file d'attente en arrière-plan. Pour réparer, essayez quelque chose comme…

public var context: NSManagedObjectContext

DispatchQueue.main.async {

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

Bien que ce soit une très mauvaise façon de procéder, vous utilisez votre délégué d'application comme variable globale (ce que nous savons tous est mauvais!).

Vous devriez envisager de passer le contexte de l'objet géré du contrôleur de vue au contrôleur de vue…

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: 

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

etc

54
Ashley Mills