2017-09-03 4 views
1

Je suis relativement nouveau dans le développement iOS et je rencontre des problèmes avec une requête de récupération des données Core. J'utilise Xcode 9-beta et swift 4.Problème avec la requête de récupération des données de base

Chaque fois que je mets à jour ma base de données, je charge les nouvelles données avec une requête d'extraction, pour faire quelques calculs et remplir une vue de table. Mon défi est que chaque fois que je fais une requête de recherche pour une entité, j'obtiens les mêmes données, même si elles ont changé. Il me semble que c'est la réutilisation des données d'une demande de récupération précédente, parce que si je ferme l'application et l'ouvre à nouveau, elle me montre les nouvelles données stockées.

Voici mon code:

if let context = container?.viewContext { 
     context.perform { 

      let request: NSFetchRequest<EntityName> = EntityName.fetchRequest() 
      let data = try? context.fetch(request) 
      self.data = data! 

      self.setUI() 
     } 
} 

Je reçois le récipient de:

let container: NSPersistentContainer? = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer 

J'ai donné quelques noms génériques, comme je pense que c'est hors de propos pour la question.

Des pensées?

Merci, JL

+0

Avez-vous des erreurs ou une sortie dans la console? – Scriptable

+0

Les requêtes d'extraction ne sont jamais réutilisées. Vous avez peut-être oublié de sauvegarder le contexte après avoir modifié les données. Btw: le conteneur persistant et le contexte d'objet géré sont supposés être non-optionnels et 'AppDelegate' est obligatoire sinon l'application ne sera pas lancée. Il n'est pas mal de forcer le déballage des objets: 'let container = (UIApplication.shared.delegate as! AppDelegate) .persistentContainer' – vadian

+0

Je ne reçois aucune erreur dans la console. Et je sauvegarde le contexte chaque fois que je change les données. –

Répondre

0

Je suis le viewcontext du récipient parce que je besoin du thread d'interface utilisateur. Je suppose que c'était mon problème. Je l'ai résolu en passant le contexte que je l'habitude de chercher et de créer les données et l'envoi de la demande à la file d'attente principale:

func loadData(with context: NSManagedObjectContext) { 

    context.perform { 

     DispatchQueue.main.async { 
      let request: NSFetchRequest<EntityName> = EntityName.fetchRequest() 
      let data = try? context.fetch(request) 
      self.data = data! 

      self.setUI() 
     } 
    } 
} 

J'espère que ça aide.

0

Si vous ne reçoivent pas d'erreurs. Peut-être parce qu'après avoir changé, vous n'avez pas sauvegardé le contexte.

Êtes-vous sûr de l'avoir fait?

Cette méthode vous permet de sauvegarder le contexte juste après le changement

private func saveContext() { 
    guard managedObjectContext.hasChanges else { 
     return 
    } 
    do { 
     try managedObjectContext.save() 
    } catch { 
     abort() 
    } 
    } 

essayer de le trouver dans AppDelegate

MISE À JOUR:

Il est aussi peut-être parce que .perform est async, et après la mise à jour des données , il n'a pas encore économisé.

exécute de façon asynchrone le bloc dans la file d'attente du contexte. encapsule une piscine autorelease et un appel à processPendingChanges

+0

Je sauvegarde le contexte. En outre, je sais que cela fonctionne parce que quand je ferme l'application et l'ouvre à nouveau, il montre les données mises à jour, donc je dirais que cela a à voir avec la demande d'extraction. Et oui, c'est dans le fichier AppDelegate. –

+0

lorsque vous mettez à jour l'interface utilisateur, est-ce le thread principal? parce que context.perform est async. Si vous changez smt et sauvegardez en asynchrone, peut-être que des données sont encore sauvegardées ou encore en cours de chargement. Essayez de le trouver et déboguer. –

+0

C'est le fil principal, sinon j'obtiendrais une erreur. En outre, je deviens vrai lors de l'utilisation: 'Thread.isMainThread' –