使用swift3制作下载速度测试应用的最佳方法是什么?

时间:2017-03-20 16:38:21

标签: swift3 ios8.1

我正在使用以下代码从此问题Right way of determining internet speed in iOS 8中删除,以便在我的应用中进行速度测试,但在进行测试并与速度测试工具http://www.speedtest.net/进行比较时,我的应用结果如果我的应用程序速度结果为1mbps,速度测试结果为2mbps或更高,则速度测试网速度低于一半

class ViewController: UIViewController, NSURLSessionDelegate, NSURLSessionDataDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    testDownloadSpeedWithTimout(5.0) { (megabytesPerSecond, error) -> () in
        print("\(megabytesPerSecond); \(error)")
    }
}

var startTime: CFAbsoluteTime!
var stopTime: CFAbsoluteTime!
var bytesReceived: Int!
var speedTestCompletionHandler: ((megabytesPerSecond: Double?, error: NSError?) -> ())!

func testDownloadSpeedWithTimout(timeout: NSTimeInterval, completionHandler:(megabytesPerSecond: Double?, error: NSError?) -> ()) {
    let url = NSURL(string: "http://insert.your.site.here/yourfile")!

    startTime = CFAbsoluteTimeGetCurrent()
    stopTime = startTime
    bytesReceived = 0
    speedTestCompletionHandler = completionHandler

    let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
    configuration.timeoutIntervalForResource = timeout
    let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    session.dataTaskWithURL(url).resume()
}

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
    bytesReceived! += data.length
    stopTime = CFAbsoluteTimeGetCurrent()
}

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
    let elapsed = stopTime - startTime
    guard elapsed != 0 && (error == nil || (error?.domain == NSURLErrorDomain && error?.code == NSURLErrorTimedOut)) else {
        speedTestCompletionHandler(megabytesPerSecond: nil, error: error)
        return
    }

    let speed = elapsed != 0 ? Double(bytesReceived) / elapsed / 1024.0 / 1024.0 : -1
    speedTestCompletionHandler(megabytesPerSecond: speed, error: nil)
}

}

2 个答案:

答案 0 :(得分:0)

我把我的文件放在不同的服务器上,每个都给我不同的结果,所以问题是速度结果取决于你从下载的服务器,解决方案是在多服务器中有文件并检测客户端的最佳服务器并从中下载。

答案 1 :(得分:0)

您的代码似乎可以使用单线程测试速度,这可能是它测量较低结果的主要原因之一。

Speedtest.net和我们这样的大多数测试人员也使用多线程方法。这是估计Internet链接容量的更好方法。

您可以在此处找到将执行多线程测量的iOS SDK:

https://github.com/speedchecker/speedchecker-sdk-ios