2014-04-28 2 views
1

J'utilise AFNetworking avec NSURLCache. Les demandes sont créées avec NSURLRequestUseProtocolCachePolicy. App reçoit des réponses avec en-têtes:Mode hors ligne utilisant NSURLCache

Etag = "1398684731"; 
Cache-Control = "public"; 

et tout fonctionne parfaitement. Mais maintenant je dois ajouter un mode hors ligne.

Comment ça devrait fonctionner:

  • Si la connexion Internet est tout disponible devrait fonctionner comme d'habitude (application demande back-end pour les nouvelles données et si elle a différents Etag nouvelles données sont téléchargées si Etag est le la même réponse mise en cache est utilisée). En l'absence de connexion Internet, la réponse mise en cache est utilisée.

Le problème est que les demandes en mode hors connexion échouent.

J'ai essayé de résoudre ceci en utilisant diverses options Cache-Control mais il semble que cela ne fonctionne pas de cette façon.

J'ai trouvé une solution possible ici https://stackoverflow.com/a/15885318/3140927. Ça devrait marcher mais ce n'est pas très élégant et je pense que quelque chose aurait pu changer l'année dernière.

J'ai également découvert que "NSURLCache n'était pas conçu pour des scénarios hors ligne explicites et qu'il était conçu pour accélérer Safari et ne devait pas être utilisé pour les téléchargements manuels". Est-ce que SDURLCache sera meilleur pour mes buts?

Alors, quel pourrait être le meilleur moyen d'implémenter le mode hors-ligne?

+0

Je pense que l'URL se résout votre problème, vous devez utiliser SDURLCache et AFNetworking puisque vous pouvez facilement modifier, ou, il vous ne voulez pas utiliser AFNetworking vous pouvez écrire votre propre classe NSURLConnection, mais puisque nous avons 'AFNetworking' et la solution, nous devrions passer à – iphonic

Répondre

0

Aujourd'hui, j'ai essayé de résoudre exactement le même problème avec cet article et cela fonctionne plutôt bien: http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/. Le point clé est ici de sous-classer NSURLCache pour rendre votre cache indépendant des en-têtes de réponse.

J'ai trouvé des exemples de fautes de couples, mais j'espère que cela vous sera utile!

1

Il semble que vous souhaitiez que la requête aboutisse, même si le cache indique que les données ont expiré et doivent être extraites du serveur. Vous pouvez avoir un peu de chance en définissant la politique de cache (politique différente pour online ou offline) de certaines requêtes où vous préférez utiliser des données périmées plutôt que d'échouer.

Grand lien est ici -> SDURLCache with AFNetworking and offline mode not working

+0

Merci, j'ai le même lien dans ma question. Ce que je veux - est d'émuler la politique de cache personnalisé. Quelque chose comme "NSURLRequest_TryToLoad_ElseUseCache". – Avt