【问题标题】:is it possible to get a new app session with KIF test?是否可以通过 KIF 测试获得新的应用会话?
【发布时间】:2018-02-28 16:22:12
【问题描述】:

我正在尝试编写一个测试,我的下一个测试应该有一个新的应用会话,以便清除我在之前的测试中所做的所有活动。我想知道 KIF 是否有可能?

【问题讨论】:

  • 你的意思是你想清除之前通过你的 URLSession 发出的所有网络请求?所以你不会有任何东西存储在缓存中?
  • @Honey 是的,在某种程度上我想清除我的应用程序上的所有缓存,以便它没有任何存储的用户数据或活动。

标签: ios swift caching urlsession kif-framework


【解决方案1】:

这是不可能的,因为 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,我创建了一个新指针!

    也就是说,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 部分将更改用于共享会话和默认会话的会话。

    我能想到的其他一些选择:

    使用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 作为您的缓存策略,但此处不适用!

    使用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 这个缓存大小会影响您的整个应用程序!我不确定您是否可以在您的应用程序中创建不同的缓存或为每个会话创建不同的缓存,这有点达不到目的!

    这种方式永远不会被缓存!


    欲了解更多信息,请参阅herehere

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2014-12-20
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2011-05-08
      相关资源
      最近更新 更多