Я использую 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 являются все КВО-совместимыми.
[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
, вы можете легко и быстро завершить свое полное истекшее время.
Yea # 1 не будет работать, потому что меня интересует латентность, # 2 выглядит но я думаю, что вы правы, что это будет громоздко, я пытаюсь использовать KVO в свойстве «NSURLSessionTaskState», и пока это выглядит как хорошее решение. – Shizam
Я знаю, что это старый вопрос, но для тех, кто ищет метод делегата Func urlSession (_ сессия: URLSession, задача: URLSessionTask, didFinishCollecting показатели: URLSessionTaskMetrics) на URLSessionTaskDelegate должны быть в состоянии предоставить много информации о запросе, в том числе о том, сколько времени потребовалось.
- 1. NSURLSessionTask никогда не звонит, когда WiFi выключен
- 2. Повторно запустить неудавшийся NSURLSessionTask
- 3. Как предотвратить повторение дубликата NSURLSessionTask
- 4. Быстро, как определить, когда начинается и заканчивается печать на UILabel?
- 5. Подождите NSURLSessionTask завершить
- 6. Есть ли способ определить, когда начинается поток Java?
- 7. Как определить, когда запрос Alamofire равен нулю?
- 8. Как определить, когда запрос завершен в mootools?
- 9. GAE: Как построить запрос, когда строка начинается со значения
- 10. как определить сопротивление начинается в МОФ
- 11. Запрос Solr начинается с
- 12. Завершение Обработчик NSURLSessionTask не запускается
- 13. iPhone NSURLSessionTask не работает на IOS 6
- 14. Как обнаружить, когда начинается горизонтальное прокручивание UITableView
- 15. Как получить строку ответа от NSURLSessionTask
- 16. iOS - загружен файл unzip NSURLSessionTask
- 17. Как определить окончательный запрос?
- 18. Как узнать, когда действительно начинается асинхронный вызов?
- 19. Когда начинается EDT?
- 20. Когда начинается popup.js?
- 21. Когда начинается подсчет GetTickCount()?
- 22. Запрос Json обрабатывается несколько раз, когда активность начинается с android
- 23. Панда запрос бросает ошибку, когда имя столбца начинается с номером
- 24. .htaccess переписать запрос, когда the_request начинается со строки в списке
- 25. Неявная фиксация в sqlite3 python, когда запрос начинается с комментария
- 26. Mongoose: Запрос для начинается с
- 27. Как определить запрос curl
- 28. Как определить системный запрос
- 29. Сеть: Когда начинается распространение пакета?
- 30. Android ProgressBar, когда активность начинается
Все это отличные способы определить, когда это делается/перенаправляется/etc, но ни один из них не указывает, когда запрос первоначально сделан. – Shizam
Это ближе, но это предполагает, что при вызове 'resume' запрос выполняется немедленно, что не всегда так,' resume' просто указывает, что задача должна быть разрешена для запуска. – Shizam
Если требуется точность. Вы можете использовать option02: я добавил пример кода. – bllakjakk