【问题标题】:NSURLConnection on iOS doesn't try to cache objects larger than 50KBiOS 上的 NSURLConnection 不会尝试缓存大于 50KB 的对象
【发布时间】:2011-11-02 05:52:40
【问题描述】:

尽管 Apple 在 iOS 上的文档 indicating otherwiseNSURLCache 根本不做任何磁盘(闪存)缓存。您可以将NSURLCache 子类化以更改获取和存储操作的行为以使用磁盘(就像SDURLCache 所做的那样),但是由于以下对缓存的使用和实现方式的严重限制,这不起作用正如你所料:

  • NSURLConnection 甚至不会调用 storeCachedResponse:forRequest: 来处理超过 50KB(确切地说是>= 52428 字节)的文件。这使得子类化NSURLCache 对我们的使用(200KB 图像)毫无意义,因为它甚至不会进入缓存。因此,我们必须在NSURLConnection 以上的级别手动添加缓存。
  • 即使手动调用 NSURLCache 的内置storeCachedResponse:forRequest:,它也只会在小于 180KB 的情况下将响应存储在内存中。我通过手动调用 storeCachedResponse 对此进行了测试,发现之前/之后 currentMemoryUsage 对于超过 180KB 的数据长度没有改变。所以我们也必须编写自己的 LRU 内存缓存。

还有其他人注意到这些问题吗?还是我缺少什么?

仅供参考,我在模拟器和 iPad 2 上运行 iOS 4.3。

【问题讨论】:

    标签: objective-c ios caching nsurlconnection nsurlcache


    【解决方案1】:

    我建议使用 ASIHTTPRequest 库而不是 NSURLRequest:

    http://allseeing-i.com/ASIHTTPRequest/How-to-use

    它具有强大的缓存 API:

    http://allseeing-i.com/ASIHTTPRequest/How-to-use#using_a_download_cache

    【讨论】:

    • ASIHTTP 不再受支持
    【解决方案2】:

    我不确定它对 UIWebviewuw 是如何工作的,但是当您使用 NSURLRequest 时,文件的最大大小取决于您如何初始化 URLCache (initWithMemoryCapacity:(NSUInteger)memoryCapacity ...)

    【讨论】:

      【解决方案3】:

      我建议使用 three20 库和 TTURLRequest。这似乎对大数据量有很好的缓存,因为它用于 Facebook,尤其是图片。

      TTURLRequest 几乎是 NSURLRequest 的替代品,所以应该很容易迁移,并且对 Three20 的其余部分没有太多依赖

      【讨论】:

        【解决方案4】:

        查看我的 AFNetworking 分支,其中包含支持磁盘保存的自定义 NSURLCache 类:https://github.com/steipete/AFNetworking/tree/disk-cache

        【讨论】:

        • 链接已过期。
        • 是的,已经几年了,显然不再维护了。
        猜你喜欢
        • 2012-01-01
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 2013-11-15
        • 2012-03-28
        • 2011-12-16
        相关资源
        最近更新 更多