2014-10-01 67 views
1

我使用NSURLSessionTask s,我试图监视一些HTTP请求需要多长时间,当NSURLSessionTask实际发出初始请求时,我可以监视哪些委托方法(或其他方法)?如果这是NSURLConnectionNSOperation之内,我只是在启动请求时启动一个计时器,但我无法控制任务何时启动。如何确定NSURLSessionTask的请求何时开始?

回答

3

请检查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, */ 
} 
+0

这些都是确定什么时候完成/重定向/等,但没有一个表明请求最初是什么时候的好方法。 – Shizam 2014-10-01 16:35:15

+0

接近,但假设当你调用'resume'时立即发出请求,但并不总是这样,'resume'只是表示允许任务运行。 – Shizam 2014-10-01 19:12:43

+0

如果要求准确性。你可以使用option02:我添加了示例代码。 – bllakjakk 2014-10-02 02:34:46

0

两个选项:

  1. 如果你愿意,你可以实现的NSURLSession委托基于再现,然后捕获didReceiveResponsedidCompleteWithError之间的时间。这肯定不会捕获接收响应所涉及的延迟,但是如果您正在寻找一个简单的措施来排除等待可用连接的时间,那就是一种方法。

  2. 另一种方法是将NSURLSessionTask对象包装在NSOperation子类中,就像您使用NSURLConnection一样。在使用工厂方法的NSURLSessionTask的完成块再现的情况下,这是微不足道的。使用基于委托的方法时会更麻烦一些(因为,令人生气的是,NSURLSession不允许我们为单个任务指定委托对象(即使它们让我们为它们关联完成块),但是所有的任务 - 会话对象级别调用特定的委托方法)。

    无论如何,当您将它包装在NSOperation子类中时,您可以非常轻松地捕获完整的已用时间。

+1

是啊#1不会工作,因为我对延迟感兴趣,#2的外观有吸引力,但我认为你是对的,它会很麻烦,我试图在NSURLSessionTaskState属性上使用KVO,到目前为止它看起来像一个很好的解决方案。 – Shizam 2014-10-01 19:14:11

1

我知道这是一个老问题,但对于那些寻找委托方法 FUNC urlSession(_会话:URLSession,任务:URLSessionTask,didFinishCollecting指标:URLSessionTaskMetrics) 上URLSessionTaskDelegate应该能够提供大量信息的关于请求包括花了多长时间。

相关问题