Swift SimplePing不起作用

时间:2016-09-27 08:35:42

标签: ios swift latency

我使用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))
    }
}

要在我的viewController中调用SimplePing,我会这样做:

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

所有结果都是nil(resultCallBack,pingClient和dateReference)。我做了一个研究来解决这个问题,我找到了一个类似于我的question,但是在目标c中。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

SimplePingClient中的签名与它试图实现的SimplePingDelegate协议不匹配。也许这些曾经在某些早期版本中匹配过,但是从Swift 5 / XCode 12.2开始并使用Apple's SimplePing code到最近一次更新是在2016年,但是没有。某些数据类型错误,某些参数标签不匹配以及某些参数缺失。这意味着SimplePingClient永远不会获得其回调,因为SimplePing在委托对象中寻找匹配的签名,找不到任何签名,然后跳过回调。

此外,由于SimplePing.h将这些委托方法声明为可选,因此不会出现编译器错误。

要查看错误并让XCode提供为您编写协议存根的方法,请在SimplePingDelegate的{​​{1}}定义中注释掉@optional(第142行)。

这是对SimplePing.h类扩展的更改,我需要进行这些更改才能使SimplePingClient工作:

SimplePingClient

答案 1 :(得分: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
    }