2016-09-27 4 views
1

Ich verwende SimplePing, um die Latenz in meiner schnellen Anwendung zu erhalten, aber ich bekomme kein Ergebnis.Swift SimplePing funktioniert nicht

Dies ist genommen Codeform hier ein Beispiel in 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)) 
    } 
} 

Und den SimplePing in meinem Viewcontroller nennen ich das tun:

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

Als ich in dieser Zeile einen Haltepunkt setzen :

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

alle Ergebnisse gleich Null sind (die resultCallBack, die pingClient und die dateReference). Ich habe eine Recherche durchgeführt, um dieses Problem zu lösen, und ich fand eine question ähnlich meiner, aber in Ziel c.

Kann mir bitte jemand helfen?

Antwort

0

könnte es der fall sein, dass simplePingClient aus dem bereich geht? In diesem Fall wird das simplePing heruntergefahren. Versuchen als globale Variable zu deklarieren:

var simplePingClient : SimplePingClient! 

und dann sollte diese Arbeit:

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