web-dev-qa-db-fra.com

Meilleur moyen de mettre en cache JSON à partir d'une API dans SWIFT?

J'ai besoin de mettre en cache les données JSON de l'API dans Swift. J'ai donc fait beaucoup de recherches et arriver à cette Post

J'ai essayé d'implémenter l'option 1 dans mon application. Mais le responsable de la douane revenait toujours à zéro. Je ne sais pas pourquoi?

Après cela, j'ai AwesomeCache . Il dit que c’est ce qu’on appelle Awesome Caching API . Mais je ne sais pas comment implémenter ceci? Je me suis référé à ce Issue . Je n'arrive toujours pas à comprendre.

Voici comment mon implémentation actuelle se présente sans cache:

Alamofire.request(.GET, "http://api.androidhive.info/volley/person_array.json")

    .responseJSON { (_, _, data, _) in
        let json = JSON(data!)
        let catCount = json.count
        for index in 0...catCount-1 {
            let name = json[index]["name"].string
            println(name)
         }

Suggérez-moi le meilleur moyen de mettre en cache JSON à partir d'une API?

Merci d'avance!

METTRE À JOUR

Ce sont mes exigences

  1. Récupérez le JSON à partir de l'API et analysez les données JSON. Celles-ci peuvent être réalisées à l'aide d'Alamofire & SwiftyJSON

  2. Je vais renseigner les données analysées dans la vue Tableau. Cela fonctionne quand l'utilisateur est en ligne. 

Mais je veux afficher les données de la table lorsque l'utilisateur est également hors ligne. 

Je dois donc sauvegarder les données analysées ou JSON dans mon cache et actualiser ou expirer le cache en une semaine ou plusieurs jours.

Je ne préfère pas stocker le JSON sur mon disque car il sera mis à jour. 

S'il vous plaît me suggérer le meilleur moyen d'y parvenir ... 

13
AruLNadhaN

Vous avez déjà de nombreux outils à votre disposition.

NSURLCache

Toutes vos demandes sont déjà stockées dans la NSURLCache dans la NSURLSessionConfiguration sur la NSURLSession stockée dans la sharedInstance de la Alamofire Manager. Ces demandes stockées respectent déjà toutes les règles de stratégie de mise en cache fournies par les serveurs que vous frappez. Vous pouvez contrôler le comportement de la mise en cache en définissant la variable requestCachePolicy sur votre propre NSURLSessionConfiguration personnalisé. Je vous suggérerais également de lire cet article génial sur NSHipster qui vous explique les tenants et les aboutissants de NSURLCache et comment le contrôler.

La création d'objets Manager personnalisés est traitée dans le fichier Alamofire docs actuel.

Téléchargement de JSON sur le disque

Vous pouvez également télécharger le fichier JSON directement sur le disque en utilisant Alamofire.download au lieu d’utiliser Alamofire.request. Cela téléchargera la charge utile dans une fileURL que vous fournissez dans la fermeture destination. Cela vous donnerait un contrôle total sur la mise en cache du fichier après ce moment. Vous devrez ensuite créer votre propre stratégie de mise en cache autour de ces fichiers si vous souhaitez suivre les règles d'en-tête de mise en cache fournies par le serveur.

Remplir la vue de table

Une fois vos données téléchargées sur le disque, vous devez les charger dans un blob NSData et les analyser en JSON pour remplir votre vue sous forme de tableau. Cela devrait être assez simple. Vous avez besoin de la destination NSURL que vous avez spécifiée à Alamofire lorsque vous avez commencé votre téléchargement. Ensuite, chargez les données du fichier dans un blob NSData. Enfin, utilisez NSJSONSerialization pour convertir l’objet NSData en un JSON AnyObject qui peut être analysé en objets de modèle pour remplir votre vue sous forme de tableau.

Évidemment, vous n'avez pas "besoin" d'analyser le JSON dans les objets de modèle, mais cela permet de protéger votre vue tableau des données JSON mal formées.

Stockage de JSON pour une utilisation hors connexion

Si vous vous en tenez à cette approche, vous devrez suivre les dates d'expiration de votre cache dans CoreData ou SQLite. Pour ce faire, vous pouvez soit mettre en cache les chemins d'accès aux fichiers JSON sur le disque, soit stocker les objets de modèle directement dans CoreData ou SQLite. Cela pourrait devenir assez compliqué et je ne recommanderais pas cette approche à moins que vous ne vouliez absolument pas mettre en cache vos objets de modèle.

Utilisation hors ligne

En règle générale, si vous devez mettre les données en cache pour une utilisation hors connexion, vous souhaitez stocker vos objets de modèle dans un environnement tel que CoreData. Vous utiliseriez la méthode Alamofire request associée à un sérialiseur responseJSON pour analyser les données au format JSON. Ensuite, vous convertissez le JSON en objets de modèle. À partir de là, vous enregistrez vos objets de modèle dans CoreData, puis vous remplissez votre vue tableau avec les objets de modèle.

La bonne chose à propos de cette approche est que tous vos objets de modèle sont mis en cache dans le cas où vous accédez à la vue table lorsque le périphérique est hors ligne. Coupler cette conception avec des requêtes à votre NSURLCache pour voir si votre demande est mise en cache, vous éviterez ainsi les appels de serveur inutiles et la logique d'analyse lorsque vos objets de modèle sont déjà générés.

Compte tenu des mises à jour de votre question initiale, je recommanderais cette approche.

28
cnoon

Vous pouvez utiliser ce cache open source. Il cache les données sur le disque et la mémoire. Peut mettre en cache de nombreux types Swift et classes personnalisées qui héritent de NSObject et se conforment au protocole NSCoding.

https://github.com/huynguyencong/DataCache

Pour implémenter: D'abord, il utilise NSCache pour le cache mémoire. NSCache utilise comme un dictionnaire . Deuxièmement, sauvegardez le cache sur le disque, utilisez les méthodes NSFileManager.

1
huync