4

私は s を使用しており、HTTP リクエストの一部にかかる時間を監視しようとしています。実際に最初のリクエストを行うNSURLSessionTaskときに、どのデリゲート メソッド (または他の何か) を監視できますか? NSURLSessionTaskこれがNSURLConnection内部の場合NSOperation、リクエストを開始するときにタイマーを開始するだけですが、タスクの開始時期を制御することはできません。

4

3 に答える 3

4

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, */
}
于 2014-10-01T16:33:20.047 に答える