2014-10-01 2 views
1

Я использую NSURLSessionTask s, и я пытаюсь контролировать, как долго выполняются некоторые из моих запросов HTTP, какой метод делегата (или что-то еще) можно отслеживать, когда NSURLSessionTask действительно делает первоначальный запрос? Если это был NSURLConnection внутри NSOperation, я бы только начал таймер, когда я запускаю запрос, но у меня нет контроля над тем, когда начинаются задачи.Как определить, когда начинается запрос 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 являются все КВО-совместимыми.

[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

Все это отличные способы определить, когда это делается/перенаправляется/etc, но ни один из них не указывает, когда запрос первоначально сделан. – Shizam

+0

Это ближе, но это предполагает, что при вызове 'resume' запрос выполняется немедленно, что не всегда так,' resume' просто указывает, что задача должна быть разрешена для запуска. – Shizam

+0

Если требуется точность. Вы можете использовать option02: я добавил пример кода. – bllakjakk

0

два варианта:

  1. Если вы хотите, вы могли бы реализовать на основе на исполнение делегата от NSURLSession, а затем захватить время, прошедшее между didReceiveResponse и didCompleteWithError. Это, по общему признанию, не отражает задержку, связанную с получением ответа, но если вы ищете простую меру, которая влияет на время ожидания доступного соединения, это один из подходов.

  2. Другой подход заключается в том, чтобы обернуть объекты NSURLSessionTask в подкласс NSOperation, как и с NSURLConnection. Это тривиально в том случае, если вы используете исполнение блока завершения для фабричных методов NSURLSessionTask. Это немного сложнее при использовании подхода на основе делегата (потому что, в ярости, NSURLSession не позволяет нам указывать объекты делегата для отдельных задач (даже если они позволяют нам связывать блоки завершения для них), а скорее все задачи, определенные методы делегата вызывают на уровне объекта сеанса).

    В любом случае, когда вы обертываете его в подклассу NSOperation, вы можете легко и быстро завершить свое полное истекшее время.

+1

Yea # 1 не будет работать, потому что меня интересует латентность, # 2 выглядит но я думаю, что вы правы, что это будет громоздко, я пытаюсь использовать KVO в свойстве «NSURLSessionTaskState», и пока это выглядит как хорошее решение. – Shizam

1

Я знаю, что это старый вопрос, но для тех, кто ищет метод делегата Func urlSession (_ сессия: URLSession, задача: URLSessionTask, didFinishCollecting показатели: URLSessionTaskMetrics) на URLSessionTaskDelegate должны быть в состоянии предоставить много информации о запросе, в том числе о том, сколько времени потребовалось.

Смежные вопросы