我为这个答案做了很多研究,所以它不准确。谨慎使用这些建议:)
let request = NSMutableURLRequest(url: url!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60)
let shared1 = URLSession.shared
let shared2 = URLSession.shared
let default1 = URLSession.init(configuration: .default)
let default2 = URLSession.init(configuration: .default)
print("shared1 session was \(shared1) urlCache: \(shared1.configuration.urlCache)")
print("shared2 session was \(shared2) urlCache: \(shared2.configuration.urlCache)")
print("default1 session was \(default1) urlCache: \(default1.configuration.urlCache)")
print("default2 session was \(default2) urlCache: \(default2.configuration.urlCache)")
将打印:
shared1 session was <__NSURLSessionLocal: 0x7f976ac0fdd0> urlCache: Optional(<NSURLCache: 0x60400000fb20>)
shared2 session was <__NSURLSessionLocal: 0x7f976ac0fdd0> urlCache: Optional(<NSURLCache: 0x60400000fb20>)
default1 session was <__NSURLSessionLocal: 0x7f976ac10b50> urlCache: Optional(<NSURLCache: 0x60400000fb20>)
default2 session was <__NSURLSessionLocal: 0x7f976ac11170> urlCache: Optional(<NSURLCache: 0x60400000fb20>)
如您所见,shared 会话将使用相同的引用,因此使用相同的会话/缓存。
default 不同。 (我没有初始化我的共享会话。我只是设置了一个指向它们的指针)。然而对于default,我创建了一个新指针!
也就是说,default 会话的默认缓存也使用共享缓存!这意味着如果您创建 2 个不同的默认会话实例,那么他们将不必下载图像两次!所以你还是有问题!
对于默认会话,默认值为共享 URL 缓存
目的。
Apple 文档:urlCache
您可以做的是创建一个全新的 urlCache 并使用它进行更改。
let memoryCapacity = 50 * 1024 * 1024
let diskCapacity = 50 * 1024 * 1024
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache
每次您需要新会话时都执行此操作。
URLCache.shared = cache 部分将更改用于共享会话和默认会话的会话。
我能想到的其他一些选择:
通过使用临时会话:
确保您看到链接!
临时会话配置对象类似于默认
会话配置对象除了对应的会话
对象不存储缓存、凭证存储或任何
与会话相关的数据到磁盘。
let session = URLSession.init(configuration: .ephemeral)
session.invalidateAndCancel()
然后在测试结束时,可能在内部:afterAll,执行session.invalidateAndCancel(),如下所示:“取消所有未完成的任务,然后使会话无效。”
您还可以使用默认会话,然后使会话无效,但临时会话可能更适合您的需求。 Ephemeral 有点像私人浏览。 (正如文档所说,您不能使共享会话无效,所以不要尝试使用它!)
我没怎么用过 KIF,但我记得它的 beforeAll 有点儿毛病。我不确定它的afterAll 是否也是如此,所以请确保它确实被调用了
这基本上意味着,对于这个 URL,永远不要使用缓存数据!
let url = URL(string:"https://static.pexels.com/photos/132037/pexels-photo-132037.jpeg")
let request = NSMutableURLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 60)
在大多数情况下,您会将.useProtocolCachePolicy 作为您的缓存策略,但此处不适用!
使用useProtocolCachePolicy,只会符合您在标头响应中获得的任何cachePolicy。如果设置为缓存 5 天,那么你将在本地缓存 5 天,直到再次发出实际的 URL 请求!
如果您使用.reloadIgnoringLocalCacheData,那么它只会覆盖标头指定的任何缓存策略,并始终从服务器再次请求。
如果我是你,我会为我的网络请求编写一个包装函数,并默认它们都使用这个.reloadIgnoringLocalCacheDatacachePolicy。
将你的缓存大小设置为0
let memoryCapacity = 0
let diskCapacity = 0
cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache!
AFAIK 这个缓存大小会影响您的整个应用程序!我不确定您是否可以在您的应用程序中创建不同的缓存或为每个会话创建不同的缓存,这有点达不到目的!
这种方式永远不会被缓存!
欲了解更多信息,请参阅here 和 here