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
Réponses
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) :
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
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