无法使用超过 2GB 的 discCapacity 配置 NSURLCache

Posted

技术标签:

【中文标题】无法使用超过 2GB 的 discCapacity 配置 NSURLCache【英文标题】:unable to configure NSURLCache with more than 2GB discCapacity 【发布时间】:2013-10-29 16:32:01 【问题描述】:

我正在尝试使用可能的最大磁盘容量来配置 NSURLCache。我在 ios 7 上。

根据文档,NSURLCache 的 discCapacity 属性是一个 NSUInteger,也就是无符号整数,它应该接受最大值 4,294,967,295 (0xFFFFFFFF)。但是,使用任何高于 0x7FFFFFFF (2147483647) 的值都会导致该值实际报告为 0,并且磁盘缓存根本不起作用。

此外,使用 0x7FFFFFFF (2GB) 实际上会在磁盘缓存填满接近 2GB 的任何位置时导致 malloc 错误。

我发现这个工作的唯一方法是最大值为 1GB (1073741824)。使用此值时,一切都按预期工作。

我想为我的应用程序使用尽可能多的磁盘容量的 NSURLCache。我如何使用 8 甚至 16GB?

更新[在 cmets 中按要求添加代码示例]:

NSURLCache* sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:sizeInBytes
                                                        diskCapacity:sizeInBytes
                                                            diskPath:@"somepath"];

[NSURLCache setSharedURLCache:sharedCache];

或者你也可以这样做:

[[NSURLCache sharedURLCache] setDiskCapacity:sizeInBytes];
[[NSURLCache sharedURLCache] setMemoryCapacity:sizeInBytes];

【问题讨论】:

你能分享一些代码来看看你是如何为 NSURLCache 分配磁盘容量和内存的吗? 【参考方案1】:

我会发表评论,但由于不允许我将其添加为答案。

这似乎是 NSURLCache 只允许 2GB 的情况 - 任何高于此值的内容都将被忽略/失败,并且缓存将不起作用(不会返回任何缓存的响应,也不会将任何内容写入磁盘)。

即使尝试通过将路径指定为容量大于 2GB 的任何值来使用现有缓存,也会导致相同的“非工作”缓存。

我建议向 Apple 提交一个错误,以正确实现该功能(是的,我们中的一些人有正当理由创建大型缓存),或正确记录其缺点。

这种行为在 High Sierra (macOS 1.13) 中仍然存在,我认为这同样适用于当前版本的 iOS (11)。

【讨论】:

我们通过创建 NSURLCache 的子类并覆盖检索/缓存内容的调用(storeCachedReponse...cachedResponseForRequest... 等)解决了这个问题,以将它们存储在我们选择的位置, 作为文件。我们甚至对数据进行即时解压缩。这允许我们设置我们自己的大小和位置限制,这样系统就不会在我们背后擦除缓存的内容(在 iOS 上很有用,因为 NSURLCache 对缓存位置的控制较少)。如果与 NSURLSession 一起使用,则需要一个子类,因为它使用 NSURLCache 的私有属性。【参考方案2】:

根据iTunes Connect Developer Guide,应用程序的大小有 2 GB 的硬性限制。这包括应用程序包、文档文件夹、tmp 文件夹、库文件夹(缓存存储在磁盘上)等。

【讨论】:

我不会将此声明解释为适用于我遇到的问题。指南指的是应用程序分发包,即您在 .ipa 中发布的所有内容。缓存,就像 NSURLCache 一样,在运行时大小不同,不是应用程序饮食包的一部分。只是我的 2c。

以上是关于无法使用超过 2GB 的 discCapacity 配置 NSURLCache的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Python 中使用 Pandas 或 Blaze 加载大文件(~2gb)

Wix:如何创建超过 2GB 的 bundle.exe(外部文件)

使 Visual Studio 2010 能够使用超过 2GB 的 RAM 意味着啥?

ADO 查询导致 mdb 数据库超过 2GB 限制

在 32 位 linux 内核上使用 c++ 在堆上分配超过 2GB

如何将超过 2Gb 的文件上传到 IIS 7.5 / .Net 4?