【问题标题】:Measuring total response time for NSURLSession's dataTaskWithRequest测量 NSURLSession 的 dataTaskWithRequest 的总响应时间
【发布时间】:2016-05-25 16:47:25
【问题描述】:

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

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

【问题讨论】:

  • 使用查尔斯?否则,在任务上调用 resume 之前调度一个块并设置时间戳。

标签: swift swift2 nsurlsession nsurlrequest nsurlsessiontask


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多