2016-09-27 93 views
1

我正在使用SimplePing来获取我的swift应用程序中的延迟,但我没有得到任何结果。Swift SimplePing不工作

这是代码采取的形式,这里的例子中SO:

import Foundation 

public typealias SimplePingClientCallback = (String?)->() 

public class SimplePingClient: NSObject { 
    static let singletonPC = SimplePingClient() 

    private var resultCallback: SimplePingClientCallback? 
    private var pingClinet: SimplePing? 
    private var dateReference: NSDate? 

    public static func pingHostname(hostname: String, andResultCallback callback: SimplePingClientCallback?) { 
     singletonPC.pingHostname(hostname, andResultCallback: callback) 
    } 

    public func pingHostname(hostname: String, andResultCallback callback: SimplePingClientCallback?) { 
     resultCallback = callback 
     pingClinet = SimplePing(hostName: hostname) 
     pingClinet?.delegate = self 
     pingClinet?.start() 
    } 
} 

extension SimplePingClient: SimplePingDelegate { 
    public func simplePing(pinger: SimplePing, didStartWithAddress address: NSData) { 
     pinger.sendPingWithData(nil) 
    } 

    public func simplePing(pinger: SimplePing, didFailWithError error: NSError) { 
     resultCallback?(nil) 
    } 

    public func simplePing(pinger: SimplePing!, didSendPacket packet: NSData!) { 
     dateReference = NSDate() 
    } 

    public func simplePing(pinger: SimplePing!, didFailToSendPacket packet: NSData!, error: NSError!) { 
     pinger.stop() 
     resultCallback?(nil) 
    } 

    public func simplePing(pinger: SimplePing, didReceiveUnexpectedPacket packet: NSData) { 
     pinger.stop() 
     resultCallback?(nil) 
    } 

    public func simplePing(pinger: SimplePing!, didReceivePingResponsePacket packet: NSData!) { 
     pinger.stop() 

     guard let dateReference = dateReference else { return } 

     //timeIntervalSinceDate returns seconds, so we convert to milis 
     let latency = NSDate().timeIntervalSinceDate(dateReference) * 1000 

     resultCallback?(String(format: "%.f", latency)) 
    } 
} 

,并调用SimplePing在我的viewController我这样做:

let simplePingClient = SimplePingClient() 
     simplePingClient.pingHostname("www.apple.com") { latency in 
     print("Your latency is \(latency ?? "unknown")") 
     self.labelTempsReponse?.text = latency 
     } 

当我把一个断点在该行:

simplePingClient.pingHostname("www.apple.com") { latency in 

结果全部为零(在resultCallBack,所述pingClient和dateReference)。我做了一项研究来解决这个问题,我发现一个类似于我的question,但在客观的c。

任何人都可以帮助我吗?

回答

0

simplePingClient是否会超出范围?在这种情况下,simplePing将会关闭。 尝试声明为一个全局变量:

var simplePingClient : SimplePingClient! 

,然后这应该工作:

simplePingClient = SimplePingClient() 
    simplePingClient.pingHostname("www.apple.com") { latency in 
    print("Your latency is \(latency ?? "unknown")") 
    self.labelTempsReponse?.text = latency 
    }