如何确定NSURLSessionTask的请求何时开始?

时间:2014-10-01 16:19:26

标签: ios objective-c nsurlsession nsurlsessiontask

我使用NSURLSessionTask并且我正在尝试监视我的一些HTTP请求需要多长时间,当NSURLSessionTask实际进行初始化时,我可以监视哪种委托方法(或其他)请求?如果这是NSURLConnection NSOperation,我只是在启动请求时启动计时器,但我无法控制任务何时开始。

3 个答案:

答案 0 :(得分:4)

请检查 NSURLSessionTaskDelegate 。它有以下委托回调:

URLSession:task:didCompleteWithError:
URLSession:task:didReceiveChallenge:completionHandler:
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
URLSession:task:needNewBodyStream:
URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:

计算时间间隔。

选项01 [近似]:

你应该在调用resume方法之后启动一个计时器,并计算何时调用委托回调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, */
}

答案 1 :(得分:1)

我知道这是一个老问题,但对于那些搜索委托方法的人来说 func urlSession(_ session:URLSession,task:URLSessionTask,didFinishCollecting metrics:URLSessionTaskMetrics) 在URLSessionTaskDelegate上应该能够提供有关请求的大量信息,包括花费多长时间。

答案 2 :(得分:0)

两个选项:

  1. 如果需要,您可以实施基于委托的NSURLSession再现,然后捕获didReceiveResponsedidCompleteWithError之间的已用时间。这无可否认地捕获了接收响应所涉及的延迟,但是如果您正在寻找一个简单的措施来计算等待可用连接的时间,那就是一种方法。

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

    无论如何,当你将它包装在NSOperation子类中时,你可以很容易地捕获完整的经过时间。