【问题标题】:How to determine when NSURLSessionTask's request begins?如何确定 NSURLSessionTask 的请求何时开始?
【发布时间】:2014-11-26 13:29:34
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c nsurlsession nsurlsessiontask


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      URLSession:task:didCompleteWithError:
      URLSession:task:didReceiveChallenge:completionHandler:
      URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
      URLSession:task:needNewBodyStream:
      URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
      

      计算时间间隔。

      选项 01 [近似值]:

      您应该在调用 resume 方法后立即启动一个计时器,并计算调用委托回调 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, */
      }
      

      【讨论】:

      • 这些都是确定何时完成/重定向/等的好方法,但它们都没有指示最初发出请求的时间。
      • 那更接近,但假设当您调用 resume 时会立即发出请求,但并非总是如此,resume 只是表示应该允许该任务运行。跨度>
      • 如果需要准确性。您可以使用 option02:我添加了示例代码。
      • 我也找到了 KVO 选项,它运行良好,我回到这里添加我自己的答案,但你打败了我 :)
      【解决方案3】:

      两种选择:

      1. 如果需要,您可以实现基于委托的NSURLSession 再现,然后捕获didReceiveResponsedidCompleteWithError 之间经过的时间。诚然,这并没有捕捉到接收响应所涉及的延迟,但如果您正在寻找一种简单的方法来计算等待可用连接的时间,那么这是一种方法。

      2. 另一种方法是将NSURLSessionTask 对象包装在NSOperation 子类中,就像您对NSURLConnection 所做的那样。在您使用 NSURLSessionTask 工厂方法的完成块再现的情况下,这是微不足道的。使用基于委托的方法时会稍微麻烦一些(因为,令人恼火的是,NSURLSession 不允许我们为单个任务指定委托对象(即使它们让我们为它们关联完成块),而是所有在会话对象级别调用特定于任务的委托方法)。

        无论如何,当您将其包装在 NSOperation 子类中时,您可以很容易地捕获您的完整经过时间。

      【讨论】:

      • 是的,#1 不起作用,因为我对延迟感兴趣,#2 看起来很有吸引力,但我认为你是对的,它会很麻烦,我正在 @ 上尝试 KVO 987654330@ 属性,到目前为止它看起来是一个很好的解决方案。
      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多