【问题标题】:Can I specify how long a response should be cached in AFNetworking?我可以指定响应应该在 AFNetworking 中缓存多长时间吗?
【发布时间】:2014-06-08 01:10:46
【问题描述】:

我是从ASIHTTPRequest 转换为AFNetworking 的迟到者。到目前为止,AFN 的性能要好得多,但我错过了 ASI 的一个功能是能够使用 ASICacheStoragePolicy 枚举指定特定项目应缓存多长时间。它让您可以指定只为该会话缓存一个项目,永久或根本不缓存。

AFNetworking 是否存在类似的情况?

【问题讨论】:

    标签: objective-c caching afnetworking asihttprequest afnetworking-2


    【解决方案1】:

    最新版本的AFNetworking依赖于两种缓存机制:

    • 图像的 NSCache
    • NSURLCache 是 NSURLConnection 的默认缓存类

    配置最后一个我相信你可以实现你想要的。
    这是amazing blog article 关于这 2 机制的。

    【讨论】:

      【解决方案2】:

      所以,从 ASICacheDelegate.h ,我们可以读到:

      // Cache storage policies control whether cached data persists between application launches (ASICachePermanentlyCacheStoragePolicy) or not (ASICacheForSessionDurationCacheStoragePolicy)
      // Calling [ASIHTTPRequest clearSession] will remove any data stored using ASICacheForSessionDurationCacheStoragePolicy
      typedef enum _ASICacheStoragePolicy {
          ASICacheForSessionDurationCacheStoragePolicy = 0,
          ASICachePermanentlyCacheStoragePolicy = 1
      } ASICacheStoragePolicy;
      

      来自Originatearticle 解释说AFNetworking 依赖于NSURLCache

      所以当你说你想要的时候

      指定响应应在AFNetworking中缓存多长时间

      关于 ASI 所做的事情,我们谈论的是应用程序启动,而不是秒(或任何时间单位)。

      因为NSURLCache 可以用作内存缓存(默认情况下,在每次应用启动之间重置)或磁盘上的持久缓存,所以您应该能够尝试所需的行为。

      简而言之,对NSURLCache 不做任何事情会给您带来ASICacheForSessionDurationCacheStoragePolicy 的行为。

      下面的sn-p会给你ASICachePermanentlyCacheStoragePolicy的行为:

      NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:2 * 1024 * 1024
                                                              diskCapacity:100 * 1024 * 1024
                                                                  diskPath:nil];
      [NSURLCache setSharedURLCache:sharedCache];
      

      最后,如果你想拥有类似[ASIHTTPRequest clearSession] 的东西,或者如果你想使用时间单位来管理你的缓存,the same article 有一个标题为“Subclass NSURLCache for Ultimate Control”的部分。

      AFAIK,使用 AFNetworking 的 API 并不容易,但这应该是为开源项目做出贡献的好机会 :)

      【讨论】:

      • 好hhhhhaggggg
      【解决方案3】:

      也许你正在寻找这个:

      AFHTTPRequestOperationManager *operation= [AFHTTPRequestOperationManager manager] ;
      operation.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
      

      枚举是:

      enum
      {
          NSURLRequestUseProtocolCachePolicy = 0,
          NSURLRequestReloadIgnoringLocalCacheData = 1,
          NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
          NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
      
          NSURLRequestReturnCacheDataElseLoad = 2,
          NSURLRequestReturnCacheDataDontLoad = 3,
      
          NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
      };
      typedef NSUInteger NSURLRequestCachePolicy;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-08
        • 2013-03-08
        • 2010-12-31
        • 2023-03-03
        • 2018-11-10
        • 2012-04-27
        • 2017-02-09
        • 1970-01-01
        相关资源
        最近更新 更多