2

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

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

1 回答 1

3

我认为你可以用一个相当微不足道的 custom 来做到这一点NSURLProtocol

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

  2. 当您收到回复时,请致电property:forKey:inRequest:以获取开始时间。

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

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

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

discretionary但是,如果请求在应用程序处于后台时发生或者如果在会话配置上设置了标志,即使这样也不一定会给你准确的时间。如果您使用具有不同配置的多个会话,这种方法也不会很容易工作。然而,就准确性而言,这可能是您能做的最好的事情,因为我怀疑是否有任何方法可以混合内置 HTTP 协议类(如果这样的类甚至存在的话)。

于 2016-05-08T04:40:55.993 回答