2017-02-17 46 views
-1

我想看看下载花了多长时间,并且我看到了这个link on how to do it ,所以我调整了一下(例如更改重命名的类等)以在Swift 3中工作但是,我有就行了一个问题:let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil),我只是无法修复,而此错误消息不断弹出:无法在Swift中创建URLSession的实例

Argument labels '(configuration:, delegate:, delegateQueue:)' do not match any available overloads

这里是我的代码:(有问题的线是一个下列//出具NEXT LINE)

import UIKit 

class ViewController: UIViewController, URLSessionDelegate, URLSessionDataDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 

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

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

/// Test speed of download 
/// 
/// Test the speed of a connection by downloading some predetermined resource. Alternatively, you could add the 
/// URL of what to use for testing the connection as a parameter to this method. 
/// 
/// - parameter timeout:    The maximum amount of time for the request. 
/// - parameter completionHandler: The block to be called when the request finishes (or times out). 
///         The error parameter to this closure indicates whether there was an error downloading 
///         the resource (other than timeout). 
/// 
/// - note:       Note, the timeout parameter doesn't have to be enough to download the entire 
///         resource, but rather just sufficiently long enough to measure the speed of the download. 

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

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

    let configuration = URLSessionConfiguration.ephemeral 
    configuration.timeoutIntervalForResource = timeout 

    ////////////////// ISSUE ON NEXT LINE /////////////////// 

    let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil) 
    session.dataTaskWithURL(url).resume() 
} 

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

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

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

}

任何人都可以告诉我这里有什么问题吗?我已经停留了一段时间了。谢谢!

回答

0

检查以下

import UIKit 

/* check delegate changes */ 

class ViewController: UIViewController, URLSessionTaskDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

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

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

    /// Test speed of download 
    /// 
    /// Test the speed of a connection by downloading some predetermined resource. Alternatively, you could add the 
    /// URL of what to use for testing the connection as a parameter to this method. 
    /// 
    /// - parameter timeout:    The maximum amount of time for the request. 
    /// - parameter completionHandler: The block to be called when the request finishes (or times out). 
    ///         The error parameter to this closure indicates whether there was an error downloading 
    ///         the resource (other than timeout). 
    /// 
    /// - note:       Note, the timeout parameter doesn't have to be enough to download the entire 
    ///         resource, but rather just sufficiently long enough to measure the speed of the download. 

    func testDownloadSpeedWithTimout(timeout: TimeInterval, completionHandler:@escaping (_ megabytesPerSecond: Double?, _ error: NSError?) ->()) { 

     let url = URL(string: "http://insert.your.site.here/yourfile")! 

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

     let configuration = URLSessionConfiguration.ephemeral 
     configuration.timeoutIntervalForResource = timeout 

     ////////////////// ISSUE ON NEXT LINE IS NOW RESOLVED/////////////////// 

     let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil) 
     session.dataTask(with: url).resume() 
    } 

    /* changes is below */ 

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { 
     bytesReceived! += data.count 
     stopTime = CFAbsoluteTimeGetCurrent() 
    } 

    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { 
     let elapsed = stopTime - startTime 

     guard let nserror = error as? NSError, elapsed != 0 && (nserror.domain == NSURLErrorDomain && nserror.code == NSURLErrorTimedOut) else { 
      speedTestCompletionHandler?(nil, error as? NSError) 
      return 
     } 

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

    /* changes end */ 

} 
+0

@Tony Tarng更正后的代码你检查的代码,并尝试过吗? –

+0

嗨,我刚刚尝试过,并且收到此错误消息:> 2017-02-17 15:21:10.242258 WiFi测试[29684:8630707] [] __nw_connection_get_connected_socket_block_invoke 2连接没有连接处理程序 2017-02- 17 15:21:10.287149 WiFi测试[29684:8630710] [] __nw_connection_get_connected_socket_block_invoke 3连接没有连接的处理程序 2017-02-17 15:21:10.289084 WiFi测试[29684:8630729] PAC流失败 2017-02-17 15:21:10.291110 WiFi测试[29684:8630710] [] nw_proxy_resolver_create_parsed_array PAC评估错误:kCFErrorDomainCFNetwork:2 nil;无 –

+0

此外,如果它有什么区别,我使用的下载测试源是:https://turnkeyinternet.net/speed-test/1mb.bin –