在iOS中计算网络速度。具有较少数据的往返时间不会告知确切的网络速度

问题描述:

我正试图在我的应用中计算网络速度,因此我只能上传可在此类网络条件下上传的大量数据。对于我的计划是:在iOS中计算网络速度。具有较少数据的往返时间不会告知确切的网络速度

  1. 我的应用程序将有一个默认的速度可能是(500KB/s)。
  2. 我的应用程序将发送具有500kb数据的请求。
  3. 它会监控系统上传数据并获取响应的往返时间。例如,应用程序在5秒内收到200kb数据,速度将为(500 + 200)/ 5。
  4. 根据上面的例子,我的带宽是140KB/s的请求。
  5. 我将从我的带宽计算指数移动平均值。
  6. 我会根据计算出的平均带宽发送下一个请求。

这里是我的NSURLSession实现:

//Initializing NSURLSession [one time only] 
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.test.ios.background") 
self.backgroundSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

// Create session task: 
var urlSessionTask = self.backgroundSession.uploadTaskWithRequest(request, fromFile: NSURL.fileURLWithPath(filePath!)) urlSessionTask.resume() 
let requestStartTime = NSDate().timeIntervalSinceReferenceDate 

//On didCompleteWithError calculating speed. 
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { 
    let downloadEndTime = NSDate().timeIntervalSinceReferenceDate 
    let networkSpeed = Int(Double(sessionTask.receivedData.length + task.countOfBytesSent)/(downloadEndTime - requestStartTime)) 
} 

如果我失去的带宽,我可以用它这种方法,因为我平均下来,但问题是,一旦我达到了低带宽,比找我的网络状况得到改善,我的带宽不会得到改善,因为我一直在请求中发送较少的数据,并且会一直说带宽很低。

有没有什么方法可以找到我的网络状况是否得到改善,并且我可以发送更多数据?

我脑海中的一个解决方案是,我可以在每第10个请求中发送最大数据(可能是500KB),所以当时我可以在网络条件下获得更高的带宽得到改善。

+0

上传数据的方式。你在使用nsurlsession吗?你能写一些面糊理解的代码吗? –

+0

@CrazyDeveloper我已经添加了相同的代码。是的,我正在使用'NSURLSession' –

为了得到指标,如要求开始和结束时间,我会建议您URLSession实施以下的委托方法

@available(iOS 10.0, *) 
optional public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) 

URLSessionTaskMetrics包含属性taskInterval,这将给你的往返时间。

至于动态修改您发送的数据量,我不明白这个方法。无论您的请求体有多大,您的应用都受网络带宽的限制;这是你无法控制的。您可以尝试利用新的URLSessionConfiguration属性,以最大化网络带宽:

@available(iOS 11.0, *) 
open var multipathServiceType: URLSessionConfiguration.MultipathServiceType 

我建议保留请求body作为 - 是让操作系统处理为贫困的网络连接优化的细节。

+1

只是指出taskInterval是从创建任务到完成任务的时间。不需要多久转移。在我的情况我做:如果让firstTransactionStartDate = metrics.transactionMetrics.first .fetchStartDate, 让lastTransactionEndDate = metrics.transactionMetrics.last .responseEndDate { 时间= responseEndDate.timeIntervalSince(firstTransactionStartDate) },以获得真正的时间? –