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?
Répondre
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.
Plusieurs points.
- 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.
- 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.
- 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.
- 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.
- 1. efficace pour interroger les grandes plistes?
- 2. Enregistrer et charger de grandes plistes
- 3. Stratégie pour traiter les grandes tables db
- 4. meilleure pratique pour traiter des éléments "structurels" communs de pages?
- 5. Meilleure pratique pour traiter JEditorPane long processus setText
- 6. Traiter les grandes instructions IF en PHP
- 7. bundle chargeable pour les plistes
- 8. meilleure pratique pour l'interrogation d'annuaire
- 9. Haskell: comment traiter les grandes listes combinatoires?
- 10. Meilleure pratique pour applicationDidEnterBackground
- 11. Quelle peut être la meilleure pratique pour stocker les grandes données
- 12. Quelle est la meilleure pratique pour traiter les coins sur un élément à hauteur fixe?
- 13. Quelle est la meilleure pratique pour traiter les états d'application et la diffusion d'événements dans AngularJS?
- 14. Meilleure pratique pour les chemins PHP
- 15. Meilleure pratique pour les services Web
- 16. meilleure pratique pour les variables constantes communes
- 17. Meilleure pratique pour les tests unitaires IHttpModule
- 18. meilleure pratique pour étendre les modèles dynamiques?
- 19. Meilleure pratique pour les boutons de soumission
- 20. Meilleure pratique pour redéfinir les classes statiques
- 21. Meilleure pratique pour enregistrer les constantes associées?
- 22. Meilleure pratique pour manipuler les collections
- 23. Meilleure pratique pour les formulaires internationalisés?
- 24. Meilleure pratique pour initialiser les variables membres?
- 25. Meilleure pratique pour Java IPC
- 26. Meilleure pratique pour ruby require
- 27. Meilleure pratique avec les classes
- 28. Meilleure pratique pour installer des dépendances?
- 29. Meilleure pratique pour obtenir EntityManagerFactory
- 30. Meilleure pratique pour NSUserDefaults synchroniser
Vous savez que vous réalisez pratiquement les plistes sans avantage? 'NSUserDefaults' stocke également les informations dans les plistes. –
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
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