2

我正在尝试在我的应用程序中计算网络速度,因此我只能上传在这种网络条件下可以上传的那么多数据。为此,我的计划是:

  1. 我的 App 会有一个默认的速度可能是(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),这样我就可以在网络条件得到改善的情况下获得更高的带宽。

4

1 回答 1

1

为了获取请求开始和结束时间等指标,我建议在您的 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原样,让操作系统处理优化网络连接不良的更精细细节。

于 2017-06-17T14:35:55.160 回答