测量NSURLSession的dataTaskWithRequest的总响应时间

时间:2016-02-14 21:20:10

标签: swift swift2 nsurlsession nsurlrequest nsurlsessiontask

当使用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);
}

1 个答案:

答案 0 :(得分:2)

我认为您可以使用相当简单的自定义NSURLProtocol来执行此操作。

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

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

  3. 话虽如此,但是不能保证请求真的会在调用canInitWithRequest:后立即启动,并且因为没有好的方法来继承原始的HTTP协议处理程序类(包装startLoading方法),这可能是也可能不够精确。我不确定。

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

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

    但是,如果在应用程序处于后台或者会话配置中设置了discretionary标志时请求正在发生,那么即使这样也不一定能为您提供精确的计时。如果您使用多个具有不同配置的会话,那么该方法也将无法轻松实现。但是,它可能是你在准确性方面所能做的最好的,因为我怀疑是否有任何方法可以调整内置的HTTP协议类(如果这样的类甚至存在)。