2015-09-18 1 views
2

J'utilise NSURLSession pour la mise en réseau et la création de requêtes POST sur un serveur. Je veux être en mesure de mettre ces requêtes en cache, mais l'URL est toujours la même.NSURLCache mise en cache avec différentes requêtes POST

Est-il possible de mettre en cache avec NSURLCache et de modifier la clé de cache à quelque chose d'unique tel que le corps de la demande?

Répondre

0

Par défaut, les requêtes IIRC, POST ne sont pas du tout mises en cache. Mais oui, vous pouvez certainement le faire. IIRC, du côté NSURLSession, la seule chose que vous pouvez contrôler est de savoir si la requête est mise en cache ou non. Pour réellement contrôler le nom sous lequel il est mis en cache, vous devez implémenter un protocole URL personnalisé. Je ne l'ai jamais fait ce que vous essayez de faire, mais je suis assez sûr que tu le ferais à peu près comme suit:

  • Créer une sous-classe NSURLProtocol et fournir via la propriété protocolClasses sur votre session configuration. À partir de ce moment, votre classe est appelée en premier lorsque l'une de ces sessions fait une demande d'URL.

  • Dans cette sous-classe, dans votre méthode startLoading, utilisez setProperty: forKey: connecterDemander: pour marquer la demande comme ayant été traitées par le protocole.

  • Dans votre canInitWithRequest méthode, appelez propertyForKey: connecterDemander: pour voir si la demande est déjà marqué, et si oui, retour NO. De cette façon, vous verrez chaque demande exactement une fois. Dans votre méthode startLoading, démarrez une nouvelle tâche de données avec la demande balisée.

  • Dans stopLoading, annulez la tâche.

  • Dans canonicalRequestForRequest:, effectuez votre conversion. Vous devrez peut-être utiliser setProperty: forKey: inRequest: pour stocker l'URL d'origine, non modifiée, au cas où vous récupériez l'URL modifiée. (Je ne suis pas sûr.)

  • Je ne pense pas que vous aurez besoin de mettre en œuvre requestIsCacheEquivalent: toRequest:, mais gardez à l'esprit, juste au cas où je me trompe. Vous pourriez être en mesure d'implémenter cela au lieu de la méthode de canonisation, aussi.

+0

@dgatwoord, J'ai vérifié la documentation de NSURLCache, mais je ne peux pas trouver s'il peut mettre en cache la requête POST. Pourriez-vous s'il vous plaît partager avec moi? – aelam

+0

Par défaut, NSURLSession/Connection ne met pas en cache les requêtes POST, car elles ne sont pas garanties d'être idempotentes. Cela dit, le cache lui-même est, si la mémoire est bonne, à peu près un simple magasin de valeurs-clés qui est conservé sur le disque. Si vous mettez un objet dedans, il devrait être là quand vous le demanderez. L'explication ci-dessus indique comment le faire. (Vous devrez peut-être aussi changer le type de requête en "GET" quand vous l'ajouterez et le récupèrerez du cache, je ne suis pas sûr.) – dgatwood

+0

Sinon, si les étapes ci-dessus ne fonctionnent pas, vous pouvez toujours commencer par les choses énumérées ci-dessus, puis ajoutez du code pour stocker les données vous-même dans un fichier. Rien ne dit que vous devez utiliser un objet NSURLCache pour faire votre mise en cache. C'est juste un moyen pratique de le faire.:-) – dgatwood