【问题标题】:How To Disable AFNetworking Cache如何禁用 AFNetworking 缓存
【发布时间】:2012-04-15 14:51:03
【问题描述】:

是否可以禁用 AFNetworking 的所有缓存功能?

我正在构建自己的自定义缓存系统,并且不希望它也占用磁盘空间。

谢谢, 阿什利

【问题讨论】:

    标签: ios caching afnetworking


    【解决方案1】:

    缓存由NSURLCache 在应用程序范围内处理。如果您不设置共享缓存,则不会缓存请求。即使使用共享的NSURLCache,iOS 上的默认实现也不支持磁盘缓存。

    也就是说,除非您有非常特殊的原因要编写自己的缓存系统,否则我会强烈建议不要这样做。 NSURLCache 足以满足 99.9% 的应用程序:它处理来自传入响应的缓存指令,并在新请求中适当地使用它们,并且以不太可能成为应用程序性能瓶颈的方式自动执行此操作。作为一个浪费了无数时间自己制作的人(后来因为完全没有必要而把它扔掉了),我想说有更好的地方来集中你的开发注意力。

    【讨论】:

    【解决方案2】:

    最初我发现 Jason Moore 的答案可以工作,但最近我注意到我的应用仍在缓存请求。我没有使用最新的 AFNetworking,所以我不知道在最近的版本中是否解决了缓存问题。

    Apple 的 URLCache 项目有这样的说法:

    默认情况下,Cocoa URL 加载系统使用一个小的共享内存 缓存。我们不需要这个缓存,所以当 应用程序启动。

    然后这样做是为了禁用缓存。

    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                            diskCapacity:0
                                                                diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    [sharedCache release];
    

    这将禁用整个应用程序的所有缓存,这在某些情况下可能并不理想,但由于NSURLRequest 不遵守请求的缓存策略,这是我能看到的唯一选项。

    【讨论】:

    • 即使使用 AFnetworking 也为我工作 - 缓存损坏从 https 服务恢复下载...
    【解决方案3】:

    我在 iOS 6 上发现请求有时会被缓存,即使请求有 NSURLRequestReloadIgnoringCacheData。添加返回 nil 的缓存响应块可防止请求被缓存。

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
                                                  cachePolicy:NSURLRequestReloadIgnoringCacheData
                                              timeoutInterval:20];
    AFJSONRequestOperation *op =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request];
    
    // DISABLE CACHE //
    [op setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
        return nil;
    }];
    
    [op start];
    

    【讨论】:

    • 我支持这个。感谢您的解决方案!
    • 为了使用AFHTTPClient,我们应该重写requestWithMethod:path:parameters。调用超级方法来获取NSURLRequest并说request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
    • 能否请您修复代码 sn-p 中错误的枚举类型?对于没有注意到有两个更新的人来说,这将是错过领先。
    • 将缓存策略设置为 NSURLCacheStorageNotAllowed 不正确。您使用的是 NSURLCacheStoragePolicy 值而不是 NSURLRequestCachePolicy。实际发生的情况是您将其设置为 NSURLRequestReturnCacheDataElseLoad 与 NSURLCacheStorageNotAllowed 具有相同的值 (2)。
    • 我刚刚更新了答案以删除不正确的枚举。很抱歉造成混淆 - 明确编辑答案比添加更新更好!
    【解决方案4】:

    不幸的是,这些方法都不适合我。我设法禁用缓存的唯一方法是这样:

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    

    Here's the original answer

    【讨论】:

    • 我有一个单例来管理后端调用。我将这两行代码放在我的init方法中,一切正常!
    【解决方案5】:
    NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
    

    【讨论】:

      【解决方案6】:

      这可能取决于您的服务器实现,但是将Cache-Control:no-store 标头添加到您的传出请求应该会导致响应包含相同的标头,从而命令NSURLCache 不将响应缓存到磁盘。

      恕我直言,这是一种比完全禁用磁盘缓存更好的方法,尤其是当您编写的 SDK 代码将被其他可能想要利用 NSURLCache 的应用程序使用时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 1970-01-01
        • 2015-10-27
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 2012-07-11
        相关资源
        最近更新 更多