2013-05-02 4 views
1

J'utilise un fichier plist qui contient toutes les données de mes applications. Le fichier est assez volumineux et actuellement je charge tout ce qui est dans les tableaux et les dictionnaires au premier lancement et je les sauvegarde dans UserDefaults pour que je n'aie plus à toucher à la plist. Comme cela prend environ 10 secondes (iP4), je me demande s'il existe une façon encore plus rapide de traiter le plist. J'ai vérifié tout le démarrage avec des instruments et en passant par les centaines d'entrées est en fait la partie la plus rapide. Il faut beaucoup de temps pour sauvegarder ces choses traitées dans NSUserDefaults.Meilleure pratique pour traiter les grandes plistes?

+0

Vous savez que vous réalisez pratiquement les plistes sans avantage? 'NSUserDefaults' stocke également les informations dans les plistes. –

+0

Vous pouvez faire tout le travail dans une file d'attente GCD. Dès le début, créez une file d'attente d'arrière-plan normale, donnez-lui un bloc qui fera votre travail. Comme suggéré @ H2CO3, mettez tout dans NSUserDefault et créez des méthodes pour obtenir les données si nécessaire. Pas besoin de le mettre à deux endroits. – John

+0

Est-ce parce que vous avez beaucoup, beaucoup de petites données, ou parce que vous avez d'énormes objets NSData? Vous ne devriez pas les conserver dans les plistes (ou NSUserDefaults, qui est lui-même une plainte). – matt

Répondre

0

Vous pouvez bénéficier de la sauvegarde du plist dans votre propre fichier. De cette façon, vous contrôlez la lecture/l'écriture, n'avez pas de surcharge associée à NSUserDefaults, et, surtout, vous pouvez assurer le format. Autrement dit, si la lecture/écriture produit le ralentissement, alors vous devrez minimiser la taille du fichier plist. Probablement en utilisant un format plist de NSPropertyListBinaryFormat_v1_0 fera que:

Voir:

+ (NSInteger) writePropertyList: (id) plist 
         toStream: (NSOutputStream *) stream 
         format: (NSPropertyListFormat)format 
         options: (NSPropertyListWriteOptions) opt 
          error: (NSError **) error 

De la liste des propriétés Guide de programmation d'Apple:

La première approche [en utilisant NSDictionary ou NSArray writeToFile] est plus simple -il ne nécessite qu'une seule invocation de méthode au lieu de deux, mais la deuxième approche a ses avantages. Il vous permet de convertir la liste des propriétés d'exécution en format binaire ainsi qu'une liste de propriétés XML . Lorsque vous convertissez une représentation statique d'une liste de propriétés en un graphique d'objets, il vous permet également de spécifier avec plus de flexibilité si ces objets sont mutables ou immuables.

0

Plusieurs points.

  1. NSUserDefaults est probablement juste un gros plan, alors pourquoi l'utiliser? Collez vos entrées dans un singleton qui contient la structure en mémoire.
  2. Si vous le faites au premier chargement parce que vous voulez qu'il soit modifiable, placez les valeurs par défaut dans votre dossier de ressources. Lorsque vous voulez le charger, vérifiez si vous l'avez dans le dossier des documents, et si vous ne le faites pas (premier chargement), copiez-le de l'ensemble de ressources vers les documents.
  3. Si vous utilisez NSUserDefaults pour la persistance, écrivez simplement vos données dans votre plist dans applicationShouldResignActive et à tout autre moment où vous apportez des modifications importantes. Ecrivez-le dans un fil d'arrière-plan, mais vous aurez probablement besoin de verrouiller ici.
  4. La meilleure pratique lorsque les temps de chargement et de sauvegarde deviennent trop importants est probablement de déplacer vers les données de base, mais 1-4 devrait vous donner plus de kilométrage avant que vous ayez besoin de faire cela.
Questions connexes