Aller au contenu


Photo

This application is modifying the autolayout engine from a background thread

Xcode swift

  • Please log in to reply
3 réponses à ce sujet

#1 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 13 mars 2017 - 09:52

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

 

 



#2 Larme

Larme

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 949 messages
  • LocationParis

Posté 13 mars 2017 - 10:02

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()
}

Tant que vous avez des dents, mangez des pommes. Tant que vous avez de l'argent, croquez la Pomme.

#3 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 13 mars 2017 - 10:10

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)
                    }
                })
                
            }
            
        }
    }



#4 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 13 mars 2017 - 10:21

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







Also tagged with one or more of these keywords: Xcode, swift

0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)