This application is modifying the autolayout engine from a background thread

j'ai l'erreur suivante a la fin de la sauvegarde de ma base et au passage à  la vue de départ


This application is modifying the autolayout engine from a background thread


 


de plus je passe dans myVCdidFinish avant d'avoir terminé la sauvegarde



self.publicDataBase.save(recordType , completionHandler: { (record:CKRecord?, error:Error?) in
if error == nil {

self.activites?.append(record!)
self.maTableView?.reloadData()

// print("Activite saved")
// self.dismiss(animated: true, completion: nil)
} else {
print(error?.localizedDescription as Any)
}
})

print("Activite saved")
self.dismiss(animated: true, completion: nil)


myVCDidFinish


Activite saved


ViewDidAppear


2017-03-13 09:33:23.543 Toi & Moi[2952:23807364] This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.


 Stack:(


0   CoreFoundation                      0x00000001087ecd4b __exceptionPreprocess + 171


1   libobjc.A.dylib                     0x0000000107e2d21e objc_exception_throw + 48


2   CoreFoundation                      0x00000001088562b5 +[NSException raise:format:] + 197


3   Foundation                          0x0000000107b2706c _AssertAutolayoutOnAllowedThreadsOnly + 180


4   Foundation                          0x0000000107b26db4 -[NSISEngine _optimizeWithoutRebuilding] + 61


5   Foundation                          0x000000010794e5dc -[NSISEngine optimize] + 91


6   Foundation                          0x0000000107b24cd4 -[NSISEngine performPendingChangeNotifications] + 84


7   UIKit                               0x00000001093a1431 -[UIView(CALayerDelegate) _wantsReapplicationOfAutoLayoutWithLayoutDirtyOnEntry:] + 158


8   UIKit                               0x00000001093a1ade -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1275


 

 


Mots clés:

Réponses

  • LarmeLarme Membre
    mars 2017 modifié #2

    Tu ne peux modifier l'UI que dans le main thread.


     


    self.publicDataBase.save() clairement, ça semble le faire en background. Ce qui est intéressant car cela peut prendre du temps.


    Et le completionHandler() apparemment ne renvoie pas le tout dans le mainthread, or tu y fais un self.maTableView?.reloadData(). Mais comme tu n'es pas dans le mainthread, ça te sort l'erreur.


    Dans, fais un dispatch_async() pour retrouver la main queue et appelle self.maTableView?.reloadData() dedans.


    Un truc de ce genre (si j'en crois les réponses Swift 3 que j'ai trouvé sur le net car je ne fais de Swift) :



    ​DispatchQueue.main.async {
        self.maTableView?.reloadData()
    }

  • merci pour ta réponse


    dans le viewDidAppear au retour j'ai un appel a loadData() qui a un DispachQueue.main.async


    n'y a-t-il pas un moyen d'attendre la fin de la sauvegarde avant de retourner à  la vue principale



    func loadData () {

    let predicate = NSPredicate(format: "UserName == 'mig'")
    let query = CKQuery(recordType: "User", predicate: predicate)

    publicDatabase.perform(query, inZoneWith: nil) { (records, error) in
    if error == nil {
    let user = records?.first
    let userReference = CKReference(record: user!, action: .none)

    // on cherche l'utilisateur
    let predicate = NSPredicate(format: "User == %@", userReference)
    let query = CKQuery(recordType: "Activites", predicate: predicate)
    query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

    self.publicDatabase.perform(query, inZoneWith: nil, completionHandler: { (records, error) in
    if error == nil {
    self.activites = records!

    DispatchQueue.main.async { () -> Void in
    self.maTableView.reloadData()
    self.miseAjourTotal()

    }
    } else {
    print (error?.localizedDescription as Any)
    }
    })

    }

    }
    }

  • je n'avais pas mis de TableViewReloadData puisqu'il est fait dans le viewDidAppear mais la table n'est pas rafraichie


    car je dois y arriver avant que la sauvegarde soit faite


Connectez-vous ou Inscrivez-vous pour répondre.