我正在尝试编写一个测试,我的下一个测试应该有一个新的应用程序会话,以便清除我在之前的测试中所做的所有活动。我想知道KIF是否有可能?
2 回答
我为这个答案做了很多研究,所以它不准确。小心使用这些建议:)
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
,我创建了一个新指针!
话虽如此,默认会话的默认缓存也使用共享缓存!这意味着如果您创建 2 个不同的默认会话实例,那么他们将不必下载图像两次!所以你还是有问题!
对于默认会话,默认值为共享 URL 缓存对象。
苹果文档: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
部分将更改用于共享会话和默认会话的会话。
我能想到的其他一些选择:
使用ephemeral
会话并在之后失效
通过使用临时会话:
确保您看到链接!
临时会话配置对象类似于默认会话配置对象,只是相应的会话对象不将缓存、凭证存储或任何与会话相关的数据存储到磁盘。
let session = URLSession.init(configuration: .ephemeral)
session.invalidateAndCancel()
然后在你的测试结束时,可能在里面:afterAll
,做session.invalidateAndCancel()
,就像这样:“取消所有未完成的任务,然后使会话无效。”
您也可以使用默认会话,然后使会话无效,但临时会话可能更适合您的需求。Ephemeral 有点像私人浏览。(正如文档所说,您不能使共享会话无效,所以不要尝试使用它!)
我没有太多使用 KIF,但我确实记得它beforeAll
有点错误。我不确定它是否也是如此afterAll
,所以请确保它确实被调用
利用reloadIgnoringLocalCacheData
这基本上意味着,对于这个 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
作为你的 cachePolicy,但不是在这里!
使用useProtocolCachePolicy
, 只会符合您在标头响应中获得的任何 cachePolicy 。如果设置为缓存 5 天,那么您将在本地缓存 5 天,直到再次发出实际的 URL 请求!
如果您使用.reloadIgnoringLocalCacheData
,那么它将覆盖标头指定的任何缓存策略,并始终从服务器再次请求。
如果我是你,我会为我的网络请求编写一个包装函数,并默认它们都使用这个.reloadIgnoringLocalCacheData
cachePolicy。
将你的缓存大小设置为0
let memoryCapacity = 0
let diskCapacity = 0
cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache!
AFAIK 这个缓存大小会影响你的整个应用程序!我不确定您是否可以在您的应用程序中创建不同的缓存或为每个会话创建不同的缓存,这有点违背了目的!
这样一来,什么都不会被缓存!
这是不可能的,因为 KIF 是从一个单独的目标实例化的。由于系统不允许这样做,因此也无法创建新的应用程序会话。