无法使用超过 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 意味着啥?