gpt4 book ai didi

swift - 测量 NSURLSession 的 dataTaskWithRequest 的总响应时间

转载 作者:搜寻专家 更新时间:2023-11-01 07:27:00 25 4
gpt4 key购买 nike

当使用 NSURLSession 的 dataTaskWithRequest 时,如果创建了许多 NSURLSessionDataTask 并且不一定会立即执行,如何测量总响应时间?存储开始时间并计算 block 内的差异不会考虑任务可能一直在等待可用线程的时间。即:

let startTime = NSDate();
let task = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
let responseTime = NSDate().timeIntervalSinceDate(startTime);
}

最佳答案

我认为您可以使用相当简单的自定义 NSURLProtocol 来做到这一点。

  1. 在您的 canInitWithRequest: 方法中,调用 NSURLProtocol 上的 setProperty:forKey:inRequest: 方法来设置自定义开始时间请求的关键。然后拒绝该请求(通过返回NO)并允许正常的 HTTP 协议(protocol)正常处理该请求。

  2. 收到响应后,调用 property:forKey:inRequest: 获取开始时间。

话虽如此,不能保证请求真的会在调用 canInitWithRequest: 后立即开始,并且因为没有很好的方法来子类化原始 HTTP 协议(protocol)处理程序类(包装 code>startLoading 方法),这可能不够精确,也可能不够精确。我不确定。

因此,如果这不起作用,那么为了提高准确性,您必须创建一个成熟的协议(protocol):

  • canInitWithRequest: 中返回 YES(除非已经为该请求设置了开始时间)
  • 在其 startLoading 方法中创建一个新的 URL session (以确保请求将立即开始)
  • 将开始时间添加到请求中
  • 在新 session 中开始请求

但是,如果请求是在应用程序处于后台时发生的,或者如果在 session 配置中设置了 discretionary 标志,即使这样也不一定能为您提供精确的时间。如果您使用不同配置的多个 session ,这种方法也不会很容易起作用。然而,就准确性而言,这可能是您所能做的最好的,因为我怀疑是否有任何方法可以调整内置 HTTP 协议(protocol)类(如果存在这样的类)。

关于swift - 测量 NSURLSession 的 dataTaskWithRequest 的总响应时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35398125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com