我正在尝试在我的应用中计算网络速度,因此我只能上传那些可以在这种网络条件下上传的数据。为此我的计划是:
这是我对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 :(得分: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
,并让操作系统处理针对不良网络连接进行优化的更精细细节。