如何确定NSURLSessionTask的请求何时开始?
我使用NSURLSessionTask
s,我试图监视一些HTTP请求需要多长时间,当NSURLSessionTask
实际发出初始请求时,我可以监视哪些委托方法(或其他方法)?如果这是NSURLConnection
在NSOperation
之内,我只是在启动请求时启动一个计时器,但我无法控制任务何时启动。如何确定NSURLSessionTask的请求何时开始?
请检查NSURLSessionTaskDelegate。它有以下代表回调:
URLSession:task:didCompleteWithError:
URLSession:task:didReceiveChallenge:completionHandler:
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
URLSession:task:needNewBodyStream:
URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
计算时间间隔。
选件01 [大致]:
你应该只调用后启动计时器恢复方法和调用委托回调didCompleteWithError时计算。
self.dataTask = [self.session dataTaskWithRequest:theRequest];
[self.dataTask resume];
NSTimeInterval totalCountdownInterval;
NSDate* startDate = [NSDate date];
NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkCountdown:) userInfo:nil repeats:YES];
选项02 [如果精度所需]:
NSURLSessionTask的属性是符合所有KVO。
[self.dataTask addObserver:self forKeyPath:@"someKeyPath" options:NSKeyValueObservingOptionOld context:nil];
[self.dataTask resume];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
// do some calculation after checking state
/*
NSURLSessionTaskStateRunning = 0,
NSURLSessionTaskStateSuspended = 1,
NSURLSessionTaskStateCanceling = 2,
NSURLSessionTaskStateCompleted = 3, */
}
两个选项:
如果你愿意,你可以实现的
NSURLSession
委托基于再现,然后捕获didReceiveResponse
和didCompleteWithError
之间的时间。这肯定不会捕获接收响应所涉及的延迟,但是如果您正在寻找一个简单的措施来排除等待可用连接的时间,那就是一种方法。-
另一种方法是将
NSURLSessionTask
对象包装在NSOperation
子类中,就像您使用NSURLConnection
一样。在使用工厂方法的NSURLSessionTask
的完成块再现的情况下,这是微不足道的。使用基于委托的方法时会更麻烦一些(因为,令人生气的是,NSURLSession
不允许我们为单个任务指定委托对象(即使它们让我们为它们关联完成块),但是所有的任务 - 会话对象级别调用特定的委托方法)。无论如何,当您将它包装在
NSOperation
子类中时,您可以非常轻松地捕获完整的已用时间。
是啊#1不会工作,因为我对延迟感兴趣,#2的外观有吸引力,但我认为你是对的,它会很麻烦,我试图在NSURLSessionTaskState属性上使用KVO,到目前为止它看起来像一个很好的解决方案。 – Shizam 2014-10-01 19:14:11
我知道这是一个老问题,但对于那些寻找委托方法 FUNC urlSession(_会话:URLSession,任务:URLSessionTask,didFinishCollecting指标:URLSessionTaskMetrics) 上URLSessionTaskDelegate应该能够提供大量信息的关于请求包括花了多长时间。
这些都是确定什么时候完成/重定向/等,但没有一个表明请求最初是什么时候的好方法。 – Shizam 2014-10-01 16:35:15
接近,但假设当你调用'resume'时立即发出请求,但并不总是这样,'resume'只是表示允许任务运行。 – Shizam 2014-10-01 19:12:43
如果要求准确性。你可以使用option02:我添加了示例代码。 – bllakjakk 2014-10-02 02:34:46