首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定NSURLSessionTask的请求何时开始?

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

Stack Overflow用户
提问于 2014-10-01 16:19:25
回答 3查看 5.3K关注 0票数 4

我使用NSURLSessionTask,并且我试图监视我的一些HTTP请求需要多长时间,我可以监视什么委托方法(或者其他什么)来监视NSURLSessionTask何时实际发出初始请求?如果这是一个NSURLConnection在一个NSOperation,我会启动计时器时,我启动请求,但我没有控制什么时候开始任务。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-01 16:33:20

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

代码语言:javascript
复制
URLSession:task:didCompleteWithError:
URLSession:task:didReceiveChallenge:completionHandler:
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
URLSession:task:needNewBodyStream:
URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:

计算时间间隔。

选项01近似

您应该在调用恢复方法之后启动一个计时器,并计算何时调用委托回调didCompleteWithError。

代码语言:javascript
复制
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兼容。

代码语言:javascript
复制
[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, */
}
票数 4
EN

Stack Overflow用户

发布于 2017-12-04 17:07:27

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

票数 1
EN

Stack Overflow用户

发布于 2014-10-01 18:13:31

有两种选择:

  1. 如果需要,可以实现基于委托的NSURLSession呈现,然后捕获didReceiveResponsedidCompleteWithError之间的运行时间。诚然,这并不能捕获接收响应所涉及的延迟,但是如果您正在寻找一种简单的度量方法,它可以将等待可用连接的时间考虑在内,这是一种方法。

  1. 另一种方法是将NSURLSessionTask对象封装在一个NSOperation子类中,就像您对NSURLConnection所做的那样。在使用NSURLSessionTask工厂方法的完成块呈现的情况下,这是非常简单的。在使用基于委托的方法时,它要麻烦一些(因为,令人恼火的是,NSURLSession不允许我们为各个任务指定委托对象(尽管它们允许我们为它们关联完成块),而是在会话对象级别调用所有特定于任务的委托方法)。 无论如何,当您将它包装在一个NSOperation子类中时,您可以很容易地捕获整个经过的时间。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26145915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档