我使用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应该能够提供大量信息的关于请求包括花了多长时间。
- 1. 如何停止并开始请求admob?
- 2. 如何准确确定何时发送HTTP请求?
- 3. 请求格式不正确时,如何获取原始请求数据?
- 4. 如何确定请求的状态码
- 5. 确定UITextView何时开始新行
- 6. 如何在.NET Asp MVC中开始页面请求时获取页面请求的初始时间戳?
- 7. 如何确定开始块的值?
- 8. 如何查找请求何时开始以及何时结束scrapy
- 9. 如何确定一系列GET请求何时完成?
- 10. 如何确定使用php开始周?
- 11. 如何确定在mootools中完成请求的时间?
- 12. Pycurl:如何确定请求的持续时间
- 13. 在计算HMAC时,如何确定HTTP请求参数顺序?
- 14. 如何确定需求请求的来源?
- 15. 如何确定DST何时在Python中的特定位置开始或结束?
- 16. 如何触发WebHandler请求的会话开始(Global.asax)事件?
- 17. 如何获得第二个请求从数组索引开始与jQuery开始?
- 18. 检测任何http请求的开始,并在angular2中完成所有请求
- 19. Facebook应用程序请求:如何确定谁邀请谁?
- 20. 如何自动确定登录和http请求所需的客户端请求?
- 21. 如何使用HTTP API请求开始构建Travis CI项目
- 22. 如何在同一个线程上调用请求开始
- 23. 如何延迟3秒。开始之前发送请求ajax?
- 24. 如何在调用item_scraped scrapy信号后开始新请求?
- 25. 如何计算Web请求的开销?
- 26. 概要分析MVC,哪些方法来确定请求的开始和结束?
- 27. 如何使.htaccess始终请求密码
- 28. 如何设置原始请求标头
- 29. 如何初始化自定义HttpServeletRequest的多部分请求
- 30. 从iOS应用开始的Http请求开始
这些都是确定什么时候完成/重定向/等,但没有一个表明请求最初是什么时候的好方法。 – Shizam 2014-10-01 16:35:15
接近,但假设当你调用'resume'时立即发出请求,但并不总是这样,'resume'只是表示允许任务运行。 – Shizam 2014-10-01 19:12:43
如果要求准确性。你可以使用option02:我添加了示例代码。 – bllakjakk 2014-10-02 02:34:46