Rafraichir l'interface avec CloudKit

Bonjour à  tous,


 


Je me suis mit à  CloudKit récemment. J'avais déjà  essayé Parse avant donc je comprend le principe. Mais quelque chose me pose problème avec CloudKit que je n'arrive pas à  résoudre. La question c'est "quand faut-il rafraichir l'interface lors d'une requête ?".


Je vous présente ce que j'ai fait :



var clipList = NSMutableArray()

func getClip() {
// On réinitialise le tableau contenant les clips
clipList = NSMutableArray()

// On défini la base de donnée publique
let container = CKContainer.defaultContainer()
let publicDataBase = container.publicCloudDatabase

// On créer une requête
let predicate = NSPredicate(value: true)
let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false)
let query = CKQuery(recordType: "Clip", predicate: predicate)
query.sortDescriptors = [sortDescriptor]

// On exécute la requête
publicDataBase.performQuery(query, inZoneWithID: nil) { (recordList, error) -> Void in
if (error == nil) {
for record in recordList {
// on ajoute les clip à  la liste
self.clipList.addObject(record)

println(self.clipList.count)

// On rafraichi l'interface
self.collectionView?.reloadData()
}
}
else {
println(error)
}
}
}

J'execute une simple requête qui va me chercher des données. Je passe donc par la méthode performQuery puis si il n'y a pas d'error, j'ajoute mes données à  mon mutableArray.


Le soucis se situe au niveau du "self.collectionView?.reloadData()". J'ai println mes données quand elle sont reçues. Donc quand je lance mon app, j'ai presque instantanément la liste qui s'affiche dans ma console, mais je suis obligé d'attendre environ 5 secondes pour que "self.collectionView?.reloadData()" soit appelé...


Et je suis tombé par hasard sur ceci : une fois que mes données sont affichées dans la console, si je scroll ma collectionView, les données apparaissent. C'est évident puisque le reloadData() est appelé quand on scroll.


 


Avez-vous une idée d'où peut provenir le soucis ?


 


Merci d'avance :)


Mots clés:

Réponses

  • Je pense que le block passé à  performQuery est exécuté dans une dispatch queue GCD en background. Il faut donc exécuter reloadData sur la main queue...
  • sinon il y a une section Swift dédiée




  • Je pense que le block passé à  performQuery est exécuté dans une dispatch queue GCD en background. Il faut donc exécuter reloadData sur la main queue...




    C'est ce que je pensais au début, alors j'ai essayé de rajouter ceci dans mon performQuery :



    dispatch_async(dispatch_get_main_queue(), { () -> Void in
    self.collectionView?.reloadData()
    })

    Or il se trouve que j'ai une erreur disant "Could not find member 'reloadData'". J'ai pas mal cherché sur le web mais je n'ai rien trouvé qui puisse m'aider...


     


     




    sinon il y a une section Swift dédiée




     


    Oui c'est vrai et vu la nature de mon problème du coup (c'est peut-être un bug de swift), il serait peut-être mieux de le déplacer dans la section adéquate dans Swift. Merci pour la remarque.


  • if let colView = self.collectionView {
    dispatch_async(dispatch_get_main_queue()) {
    colView.reloadData()
    }
    }
  • AliGatorAliGator Membre, Modérateur


    if let colView = self.collectionView {
    dispatch_async(dispatch_get_main_queue()) {
    colView.reloadData()
    }
    }

    Je suis d'accord mais bon normalement l'Optional Chaining qu'a essayé Benjo devrait quand même marcher et pas lui faire une erreur non plus...
  • zoczoc Membre
    février 2015 modifié #7

    Tout à  fait, je ne comprends pas non plus pourquoi l'optional chaining ne convient pas. En même temps j'ai vu des problèmes similaires sur StackOverflow avec comme solution celle que je donne...


     


    Bug du compilo ? (Je n'ai pas de Mac sous la main pour tester dans playground).


  • AliGatorAliGator Membre, Modérateur
    Benjo tu as testé avec Swift 1.2 et Xcode 6.3 Beta au moins ? Vu la grosse quantité de bugs de compilo qu'ils ont testé, ça en fait peut-être partie...
  • BenjoBenjo Membre
    février 2015 modifié #9



    if let colView = self.collectionView {
    dispatch_async(dispatch_get_main_queue()) {
    colView.reloadData()
    }
    }



    Effectivement ta solution fonctionne. Merci pour ta réponse zoc


     


     




    Benjo tu as testé avec Swift 1.2 et Xcode 6.3 Beta au moins ? Vu la grosse quantité de bugs de compilo qu'ils ont testé, ça en fait peut-être partie...




     


    C'est ce que j'étais en train de me dire j'ai vu ça sur MacG du coup j'ai téléchargé Xcode 6.3 et oui ça marche. Du coup j'ai plein d'erreurs avec Xcode 6.3 mais c'est une autre histoire ça.


     


    Merci pour vos réponses.


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